2016-07-27 37 views
2

我不是任何想象力的Python专家,但是这个让我难住。无论是我还是错过了一些完全明显的东西。它必须是其中的一个。Numpy奇怪的行为 - 健全性检查。这怎么可能?

我有两个numpy阵列,aba应该是b的适当子集。为了证实这一点,我产生了设置差异:

>>> np.setdiff1d(a, b) 
array([], dtype=float64) 

如预期的那样。因此ab的子集。 除非我的setdiff1d理解是错误的,我想这可能是,但我重读文档,它指出setdiff1d返回:在AR1值

排序维数组不在AR2。

好的,这里是一些奇怪的事情发生。我有一些价值p。下面列出的是一个真实的陈述,如果a真的是b一个子集: 如果pa,然后p也是b

当试图证实这一点,我得到:

>>> p in a 
True 
>>> p in b 
False 

所以我不确定发生了什么,我希望有人会指出我愚蠢的错误和笑声。

+1

通过确定它们是否彼此完全相等但它们不是由于浮点错误引起的,您正在比较浮点数。 – Suever

+0

就是这样。谢谢。在Pandas和Numpy之间移动时,id列上的dtype会发生分歧(可能是由于类型内聚?),一个是float64,另一个是int64。如果你将你的评论复制到回复中,你就会得到答案。 – user3667122

回答

1

setdiff1d和您的其他方法检查编号为确切平等。由于浮点错误,很可能你的数字不是,确切地说相等。如果你想做浮点比较,你应该使用一个非常小的epsilon。

if abs(a - b) < 1e-12: 
    disp('equal!') 
+1

参见http://docs.scipy.org/doc/numpy-dev/reference/generated/numpy.isclose.html和http://docs.scipy.org/doc/numpy-dev/reference/generated/numpy .allclose.html#numpy.allclose用于与您进行浮点比较的例程。 – mtrw