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演算子ではなく、ビットごとの or 演算子 ( ) をオーバーロードします。

于 2011-12-25T23:06:55.187 に答える
22

例のようにブール値のみで比較する場合は|、Jcollado が提案するビットごとの OR 演算子を使用できます。ただし、 などの非ブール値を使用すると、奇妙な結果になる可能性があることに注意してくださいmask = (foo < 40) | overrideoverrideFalse、True、1、または 0 のいずれかであることが保証されている限り、問題ありません。

より一般的なのは、NumPy の比較集合演算子np.anynp.all. このスニペットは、40 未満または 3 の倍数でない 35 ~ 45 のすべての値を返します。

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])

ほど良くはありませんが|、質問のコードよりは優れています。

于 2012-06-28T14:31:55.683 に答える
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 に答える