如何在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.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])
不如用|
,但比你的问题中的代码更好。
您可以使用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