对numpy数组的算术比较
>>> import numpy as np
>>> x = np.eye(3)
>>> x[1, 2] = .5
>>> x
array([[ 1. , 0. , 0. ],
[ 0. , 1. , 0.5],
[ 0. , 0. , 1. ]])
>>> 0 < x.any() < 1
False
>>>
我想检查一个numpy数组里是否有任何值在0和1之间。
我之前理解为 0 < x.any() < 1
是“如果有任何元素大于0且小于1,就返回真”,但这显然不是这样。
我该如何在numpy数组上进行算术比较呢?
2 个回答
1
你的代码首先检查 x.any()
,这个检查的结果是 True
,因为 x
里面有一个非零的值。接着,它又检查 0 < True (=1) < 1
,这个检查的结果是 False
。你可以这样做:
((0 < x) & (x < 1)).any()
2
>>> np.any((0 < x) & (x < 1))
True
x.any()
实际上是做什么的呢?它和 np.any(x)
是一样的,意思是如果 x
中有任何一个元素不为零,就返回 True
。所以你的比较 0 < True < 1
是假的,因为在 Python 2 中 0 < True
是真的,但 True < 1
不是,因为 True == 1
。
而在这种方法中,我们会为每个元素创建一个布尔数组,判断比较是否为真,然后检查这个数组中是否有任何元素为真:
>>> 0 < x
array([[ True, False, False],
[False, True, True],
[False, False, True]], dtype=bool)
>>> x < 1
array([[False, True, True],
[ True, False, True],
[ True, True, False]], dtype=bool)
>>> (0 < x) & (x < 1)
array([[False, False, False],
[False, False, True],
[False, False, False]], dtype=bool)
你必须明确使用 &
,因为不幸的是,numpy 不支持(而且我认为也无法)使用 Python 内置的比较运算符链式比较。