Python numpy np.in1d()例程中可能存在错误

Python numpy np.in1d()例程中可能存在错误,python,python-3.x,numpy,Python,Python 3.x,Numpy,我正在测试numpynp.inad()例程,以查看它是否按预期工作,因为我需要将其包含在程序中。也就是说我试过了 >>> import numpy as np >>> x = np.arange(0, 1, 0.1) >>> y = np.arange(0.5, 1, 0.2) >>> x array([0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]) >>&g

我正在测试numpy
np.inad()
例程,以查看它是否按预期工作,因为我需要将其包含在程序中。也就是说我试过了

>>> import numpy as np
>>> x = np.arange(0, 1, 0.1)
>>> y = np.arange(0.5, 1, 0.2)
>>> x
array([0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9])
>>> y
array([0.5, 0.7, 0.9])
>>> np.in1d(x, y)
array([False, False, False, False, False,  True, False, False, False, False])
上次评估的结果似乎是错误的。根据中所述,我希望它是相反的

array([False, False, False, False, False,  True, False, True, False, True])
我正在使用Python 3.7.3和NumPy 1.16.1。我第一次尝试它是在命令行上,然后在IDLE中复制上面的MWE,以查看它是否是一个bug或其他东西,但结果是相同的

这是一个已知的问题吗?numpy如何为
np.arange()
定义
dtype
是个问题吗?或者是别的什么东西,比如Python/numpy版本


编辑:我试着做同样的操作,但用整数代替,结果和我最初预期的一样。我特别做到了:

>>> x = np.arange(10)
>>> y = np.arange(5, 10, 2)
>>> np.in1d(x, y)
array([False, False, False, False, False,  True, False,  True, False, True])

这让我怀疑这是一个与数组的
dtype
相关的bug。

这是numpy.arange循环数字的方式。执行此操作时,您可以更清楚地看到:

y[2]

Output 0.8999999999999999  

他们不平等。所以你在最后一个位置得到了假

但是,如果您要像这样构建NDARRAY:

a = np.array([0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9])
b = np.array([0.5, 0.7, 0.9])
然后:

np.in1d(a, b)
输出:

array([False, False, False, False, False,  True, False,  True, False,
        True])

您将获得所需的输出。

这与
np.inad
无关,而是与浮点数的实现有关。不幸的是,十进制数在有限长度二进制中通常不能精确表示,因此在浮点中存在小的不精确性。自己检查一下:

print(x[7],y[1]) #result: 0.7000000000000001 0.7 
print(x[9],y[2]) #result: 0.9 0.8999999999999999

我明白了,这是有道理的。但是,既然numpy管理浮动的方式存在这样的不精确性,那么
in1d
例程不应该包含一个误差范围吗?@SV这不是
numpy
管理浮动本身的方式,而是numpy.arange生成浮动的方式。这就是为什么我在回答中添加了a-b示例,这是为了说明问题所在。当您(有点)从列表等中手动构造numpy中的数组时,您不会遇到这个问题。@SV
inad
意味着大致相当于
np.array([b中的项表示a中的项])
,而
中的
关键字没有这样的误差范围。能够自己指定一个边距参数可能很好,但它打破了对称性,可能会产生令人惊讶的结果。写下你自己的误差幅度并不难。
print(x[7],y[1]) #result: 0.7000000000000001 0.7 
print(x[9],y[2]) #result: 0.9 0.8999999999999999