[英]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.