繁体   English   中英

当数组元素和目标不是相同的数据类型时,numpy.where()方法如何处理相等条件

[英]how does numpy.where() method handle the equality condition when the array element and target are not the same data type

我有一个很长的列表,其元素类型是int。 我想找到等于某个数字的元素索引,并使用np.where来实现这一点。

以下是我的原始代码,

# suppose x is [1, 1, 2, 3]
y = np.array(x, dtype=np.float32)
idx = list(np.where(y==1)[0])
# output is [0, 1]

经过一段时间检查代码后,我意识到我不应该使用dtype=np.float32因为它会将y的数据类型更改为float。 正确的代码应该如下,

# suppose x is [1, 1, 2, 3]
y = np.array(x)
idx = list(np.where(y==1)[0])
# output is also [0, 1]

令人惊讶的是,这两个代码片段产生了完全相同的结果。

我的问题

我确实在numpy.where处理了相等性测试的条件。当数组和目标的数据类型不兼容时(int vs float,例如)?

NumPy( 这里的源代码)不关心数据类型的比较:它的第一个参数是bool类型的数组。 当你写y == 1 ,这是一个数组比较操作,它返回一个布尔数组,然后作为参数传递给where

相关的方法是equal ,您可以通过编写y == 1隐式调用。 它的文件说:

比较的是价值,而不是类型。

例如,

x, y, z = np.float64(0.25), np.float32(0.25), 0.25

这些都是不同的类型, (numpy.float64, numpy.float32, float)但是x == y和y == z和x == z都是True。 重要的是0.25在二进制系统(1/4)中精确表示。

x, y, z = np.float64(0.2), np.float32(0.2), 0.2

我们看到x == y为False,y == z为False,但x == z为True,因为Python浮点数是64位,就像np.float64一样。 由于1/5并不完全用二进制表示,因此使用32位与64位会导致两个不同的近似值达到1/5,这就是相等失败的原因:不是因为类型,而是因为np.float64(0.2)np.float32(0.2)实际上是不同的值(它们的差异大约是3e-9)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM