对numpy数组的算术比较

4 投票
2 回答
579 浏览
提问于 2025-04-17 18:59
>>> 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 内置的比较运算符链式比较。

撰写回答