为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕尼黑5688855 2022-07-12 10:07:10
我正在测试 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])

你得到你想要的输出。


查看完整回答
反对 回复 2022-07-12
?
倚天杖

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


查看完整回答
反对 回复 2022-07-12
  • 2 回答
  • 0 关注
  • 146 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号