如何对numpy数组执行按元素的布尔操作

2024-06-28 18:57:28 发布

您现在位置:Python中文网/ 问答频道 /正文

例如,我想创建一个遮罩,遮罩值在40到60之间的元素:

foo = np.asanyarray(range(100))
mask = (foo < 40).__or__(foo > 60)

看起来很难看,我写不出来:

(foo < 40) or (foo > 60)

因为我的结局是:

  ValueError Traceback (most recent call last)
  ...
  ----> 1 (foo < 40) or (foo > 60)
  ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

有没有一种规范的方法可以对具有好看代码的numpy数组执行元素布尔操作?


Tags: orthe元素mostfoonprangemask
3条回答

您可以使用numpy logical operations。在您的示例中:

np.logical_or(foo < 40, foo > 60)

如果只在布尔值内进行比较(如示例中所示),则可以使用Jcollado建议的按位或运算符|。但请注意,如果您曾经使用过非布尔值,比如mask = (foo < 40) | override,这会给您带来奇怪的结果。只要override保证为False、True、1或0,就可以了。

更一般的是使用numpy的比较集运算符np.anynp.all。此代码段返回35到45之间小于40或不是3的倍数的所有值:

import numpy as np
foo = np.arange(35, 46)
mask = np.any([(foo < 40), (foo % 3)], axis=0)
print foo[mask]
OUTPUT: array([35, 36, 37, 38, 39, 40, 41, 43, 44])

不如|好,但比问题中的代码好。

你试过这个吗?

mask = (foo < 40) | (foo > 60)

注意:对象中的__or__方法重载按位或运算符(|),而不是布尔or运算符。

相关问题 更多 >