74

例如,我想创建一个掩码来掩码值在 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 数组进行逐元素布尔运算?

4

4 回答 4

108

试试这个:

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

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

于 2011-12-25T23:06:55.187 回答
22

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

更通用的是使用 NumPy 的比较集运算符,np.any以及np.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])

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

于 2012-06-28T14:31:55.683 回答
18

您可以使用NumPy 逻辑操作。在您的示例中:

np.logical_or(foo < 40, foo > 60)
于 2017-07-28T18:34:21.353 回答
7

请注意,您可以~用于元素否定。

arr = np.array([False, True])
~arr

OUTPUT: array([ True, False], dtype=bool)

&按元素

arr_1 = np.array([False, False, True, True])
arr_2 = np.array([False, True, False, True])

arr_1 & arr_2

OUTPUT:   array([False, False, False,  True], dtype=bool)

这些也适用于Pandas系列

ser_1 = pd.Series([False, False, True, True])
ser_2 = pd.Series([False, True, False, True])

ser_1 & ser_2

OUTPUT:
0    False
1    False
2    False
3     True
dtype: bool
于 2016-09-30T11:59:58.613 回答