4

次のオブジェクトの配列を使用します。

a = np.array([[1], [1, 2], [1, 2, 3], [1], [1]], dtype=object)
b = np.array([(1,), (1, 2), (1, 2, 3), (1,), (1,)], dtype=object)

次の等価チェックは機能しません。

a==[1]
#array([False, False, False, False, False], dtype=bool)

b==(1,)
#array([False, False, False, False, False], dtype=bool)

代わりに文字列を使用する場合:

c = np.array(['[1]', '[1, 2]', '[1, 2, 3]', '[1]', '[1]'])

等価チェックは機能します:

c == '[1]'
#array([ True, False, False,  True,  True], dtype=bool)

配列チェックがそのように動作するのはなぜですか?

a または b を反復してチェックを実行すると、期待される結果も得られます。

[i==[1] for i in a]
#[True, False, False, True, True]

[i==(1,) for i in b]
#[True, False, False, True, True]

ありがとうございました!

4

1 に答える 1

6

NumPy は、多くの状況で配列のようなオブジェクトを配列として自動的に扱うように設計されています。ここで、NumPy は[1](1,)が配列のようなオブジェクトであることを認識し、ブロードキャストルールを適用します。両側の長さ 1 の軸は、他のオブジェクトの対応する軸の長さに拡張されます。一方のオブジェクトの寸法が他方よりも小さい場合、不足している寸法は左側に、それらの寸法での他方のオブジェクトの長さで埋められます。したがって、

a == [1]

と同じ結果が得られます

a == numpy.array([1, 1, 1, 1, 1])

これは 5Falseの配列です。

于 2013-08-03T07:27:23.067 に答える