>>> 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,则返回true',但显然不是这样。
如何对numpy数组进行算术比较?
答案 0 :(得分:2)
>>> np.any((0 < x) & (x < 1))
True
x.any()
实际上做了什么:它与np.any(x)
相同,这意味着如果True
中的任何元素都非零,则返回x
。所以你的比较是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的内置的比较运算符链。
答案 1 :(得分:1)
您的代码首先测试x.any()
,其评估结果为True
,因为x
包含非零值。然后它会测试0 < True (=1) < 1
,即False
。做:
((0 < x) & (x < 1)).any()