我正在测试 numpynp.in1d()例程以查看它是否按预期工作,因为我需要将它包含在程序中。即我试过>>> import numpy as np>>> x = np.arange(0, 1, 0.1)>>> y = np.arange(0.5, 1, 0.2)>>> xarray([0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9])>>> yarray([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 以查看它是否是错误或什么,但结果是相同的。这是一个已知的问题?numpy 的定义方式有问题dtype吗np.arange()?还是其他的东西,比如 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数组相关的错误。
2 回答

慕田峪7331174
TA贡献1828条经验 获得超13个赞
这是 numpy.arange 舍入数字的方式。当你这样做时,你可以更清楚地看到它:
y[2]
Output 0.8999999999999999
和
x[9]
Output 0.9
他们不相等。所以你在最后一个位置得到了 False 。
但是,如果您要像这样构造 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])
你得到你想要的输出。

倚天杖
TA贡献1828条经验 获得超3个赞
这不是问题np.in1d
,而是与浮点数的实现有关。不幸的是,十进制数通常不能精确地用有限长度的二进制表示,因此浮点数存在一些小的不准确性。自己检查一下:
print(x[7],y[1]) #result: 0.7000000000000001 0.7 print(x[9],y[2]) #result: 0.9 0.8999999999999999
添加回答
举报
0/150
提交
取消