50

簡単な質問のはずですが、どこにも答えが見つかりません。Pythonの~演算子は、ビットごとの反転演算子として文書化されています。罰金。私は統合失調症のように見える行動に気付きました。

~True -> -2
~1 -> -2
~False -> -1
~0 -> -1
~numpy.array([True,False],dtype=int) -> array([-2,-1])
~numpy.array([True,False],dtype=bool) -> array([False,True])

最初の 4 つの例では、Python が (ドキュメントにあるように) を実装していることがわかります。入力はboolean であっても~x = -(x+1)int として扱われます。したがって、スカラーブール値の場合、は論理否定として扱われません。int 型を使用してブール値で定義された numpy 配列で動作が同じであるというわけではありません。~

~次に、ブール配列の論理否定演算子として機能するのはなぜですか (注意: ~numpy.isfinite(numpy.inf) -> True?)?

not()スカラーで使用しなければならないのは非常に面倒ですがnot()、配列を否定することはできません。次に、配列の場合は を使用する必要~がありますが~、スカラーを否定するには機能しません...

4

1 に答える 1

46

notは、または__nonzero__を返す必要がある特別なメソッドを介して実装されるため、必要な結果を得ることができません。代わりに、特別なメソッドを介して実装される演算子が使用されます。同じ理由で、とがとの代わりに使用されます。TrueFalse~__not__&|andor

PEP 335ifは、ブール演算子のオーバーロードを許可することを目的としていましたが、過度のオーバーヘッド (ステートメント が複雑になるなど) のために拒否されました。PEP 225は、より一般的な解決策を提供する「要素ごとの」演算子の一般的な構文を提案していますが、延期されています。現在の状況は、ぎこちなくても、変化を強いるほど苦痛ではないようです。

np.isfiniteスカラーで呼び出されると、np.bool_ではなく型の値を返しますboolnp.bool_bool dtype の配列からスカラー値を抽出するときに取得する型でもあります。np.True_andnp.False_の代わりにTrueandを使用すると、 のFalse下で一貫した動作が得られます~

于 2012-11-28T09:59:32.340 に答える