私は整数の配列を持ち、その配列が複数の値のリスト内の任意の値と等しい位置を探したいと思っています。これは、個々の値を個別に処理するか、複数の "または"ステートメントをループで使用することで簡単に行うことができますが、それを行うためのより良い/より速い方法が必要であるように感じられます。私は実際のサイズの4000x2000の配列を扱うが、ここでは、問題の簡略化版ですよ。私が望む何find numpyの配列が値リストの任意の値と等しい
fake=arange(9).reshape((3,3))
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
want=(fake==0)+(fake==2)+(fake==6)+(fake==8)
print want
array([[ True, False, True],
[False, False, False],
[ True, False, True]], dtype=bool)
はfake
を含む単一のコマンドからwant
を取得する方法と値のリストである[0,2,6,8]
。私は自分自身でコマンドを書くことができましたが、私はPythonでループを持つ関数を書いた場合よりもはるかに高速であることが既に含まれているパッケージがあると仮定しています。
おかげで、 -Adam
Hmm。 \t 'デフEqualsAny(AR、ヴァルス): \tアウト=ゼロ(ar.shape、DTYPE =ブール値)ヴァルスヴァルため \t:アウト \t + =(AR私はこの仕事をするために、この非常に単純な関数を書きました== out' val)で \tリターンは私が 'numpy.in1d'がより速くなるだろうと思ったが、それは実際には)同じ結果のために(時間がかかります: \t' [11]にします。%はtimeit EqualsAny(badlabels、smallnumを) \t 1ループ、1ループあたり3:519msのベスト \t [7]:%timeit in1d(badlabels、smallnum).reshape(badla bels.shape) \t 1ループ、3ループの中で最高:871ミリ秒 ' 'numpy.in1d'はC言語で書かれているので高速にしてはいけませんか? '%timeit'を正しく使用していませんか? – arwright3
いいえ、 'in1d'はcで書かれていませんが、Pythonでは、私が与えたソースコードへのリンクを見てください。 'sort'のような色々な関数を使います。これはC言語で書かれていなければなりません。' vals'が短いときに最適化されたアルゴリズムもあります。これはあなたの解法にかなり似ています(しかし ' + = ')。私はあなたのバージョンがより速い理由を知らない、これは両方の入力の長さに依存するかもしれない。 –