猿问

numpy np.in1d() 例程中可能出现的错误

我正在测试 numpynp.in1d()例程以查看它是否按预期工作,因为我需要将它包含在程序中。即我试过


>>> 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 以查看它是否是错误或什么,但结果是相同的。


这是一个已知的问题?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数组相关的错误。


慕尼黑5688855
浏览 147回答 2
2回答

慕田峪7331174

这是 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])你得到你想要的输出。

倚天杖

这不是问题np.in1d,而是与浮点数的实现有关。不幸的是,十进制数通常不能精确地用有限长度的二进制表示,因此浮点数存在一些小的不准确性。自己检查一下:print(x[7],y[1]) #result: 0.7000000000000001 0.7  print(x[9],y[2]) #result: 0.9 0.8999999999999999
随时随地看视频慕课网APP

相关分类

Python
我要回答