如何在numpy数组上执行元素明智的布尔操作

例如,我想要创build一个掩码值为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数组,具有良好的代码?

你尝试过吗?

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

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

如果您只在布尔值范围内进行比较,则可以使用按位或运算符| 正如Jcollado所build议的那样。 但是要小心,如果你使用了非布尔值,那么这会给你带来奇怪的结果,比如mask = (foo < 40) | override 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]) 

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

您可以使用numpy逻辑操作 。 在你的例子中:

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

请注意,您可以使用~作为元素否定。

 arr = np.array([False, True]) ~arr OUTPUT: array([ True, False], dtype=bool) 

& elementwise

 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