12

NumPy では、次のようなブール配列を生成できます。

>>> arr = np.array([1, 2, 1, 2, 3, 6, 9])
>>> arr > 2
array([False, False, False, False,  True,  True,  True], dtype=bool)

比較を連鎖させるにはどうすればよいでしょうか。例えば:

>>> 6 > arr > 2
array([False, False, False, False,  True,  False,  False], dtype=bool)

そうしようとすると、エラーメッセージが表示されます

ValueError: 複数の要素を持つ配列の真の値があいまいです。a.any() または a.all() を使用する

4

3 に答える 3

25

あなたが得ることができる最も近いAFAIKは、、、およびを使用する&こと|です^

>>> arr = np.array([1, 2, 1, 2, 3, 6, 9])
>>> (2 < arr) & (arr < 6)
array([False, False, False, False,  True, False, False], dtype=bool)
>>> (2 < arr) | (arr < 6)
array([ True,  True,  True,  True,  True,  True,  True], dtype=bool)
>>> (2 < arr) ^ (arr < 6)
array([ True,  True,  True,  True, False,  True,  True], dtype=bool)

a < b < c-style チェーンを機能させることはできないと思います。

于 2013-06-12T21:10:43.237 に答える
10

numpy 論理演算子を使用して、同様のことを行うことができます。

>>> arr = np.array([1, 2, 1, 2, 3, 6, 9])
>>> arr > 2
array([False, False, False, False,  True,  True,  True], dtype=bool)
>>>np.logical_and(arr>2,arr<6)
Out[5]: array([False, False, False, False,  True, False, False], dtype=bool)
于 2013-06-12T21:13:56.890 に答える
2

連鎖比較は numpy では許可されていません。左と右の両方の比較を別々に記述し、それらをビットごとの演算子で連結する必要があります。また、演算子の優先順位により、両方の式を括弧で囲む必要があります( |&および^より高い優先順位があります)。この場合、両方の条件を満たす必要があるため、ビットごとの AND ( &)が必要です。

(2<arr) & (arr<6)
# array([False, False, False, False,  True, False, False])

PEP 535でこれを可能にすることが実際に提案されましたが、まだ延期されたままです。その中には、なぜこれが起こるのかについての説明があります。質問で提起されたように、このような方法で比較を連鎖すると、次のようになります。

2<arr<6

ValueError: 複数の要素を持つ配列の真の値があいまいです。a.any() または a.all() を使用する

ここでの問題は、python が内部的に上記を次のように拡張していることです。

2<arr and arr<6

多くの値を持つブール配列はまたはのどちらにも評価されないため、andは暗黙的に を呼び出しboolNumPy単一要素 ( の配列ではない) のブール値への暗黙的な強制のみを許可するため、これがエラーの原因です。これが許可されないのはこのあいまいさによるものであり、ブール値のコンテキストで配列を評価すると、常にsize>1TrueFalseValueError

于 2020-06-21T13:39:41.040 に答える