3

numpy 配列が他の numpy 配列内にあるかどうかを確認する必要がありますが、python リストとは異なるように動作するようです。この質問をnumpyドキュメントとインターネットで検索しようとしましたが、答えませんでした. これは例です:

import numpy as np

m1=np.array([[1,2,3],[5,3,4]])
m2=np.array([5,4,3])
m2 in m1
True
m3=[[1,2,3],[5,3,4]]
m4=[5,4,3]
m4 in m3
False

numpy では True を取得しますが、Python リストでは False を取得します。これを機能させるためのnumpy関数はありますか?

ありがとう。

4

1 に答える 1

3

リストの場合と同じ動作を得るにinは、次のようにします。

any(np.all(row == m2) for row in m1)

これは理想的ではありませんが、うまくいくはずです。

numpy で何が起こっているかを理解するために、numpy メーリング リストの Robert Kern によるinのセマンティクスの説明を次に示します。in

これは、bool(some_array) の Numeric のセマンティクスにさかのぼります。これは、要素のいずれかがゼロでない場合に True になります。Python の他の反復可能なコンテナーと同様に、x in y基本的には

for row in y:
   if x == row:
       return True
return False

y の最初の軸に沿って反復し、ブール値で比較します。Numeric/numpy の場合、この比較はブロードキャストされます。これが [3,6,4] が機能する理由です。最初の列に 3 がある行が 1 つあるからです。[4,2,345] は、4 と 2 がこれらの列にないため機能しません。

おそらく、これは bool(some_array) が例外を発生させるという numpy のセマンティクスへの移行中の間違いと見なされるべきです。 おそらく ND 配列に対してそのまま機能するはずですが、bool(some_array) のように、明示的に綴る必要がscalar in arrayあるセマンティクスがいくつかあります。array in array

于 2012-11-03T02:31:02.337 に答える