2013-10-23 12 views
11

私は整数の配列を持ち、その配列が複数の値のリスト内の任意の値と等しい位置を探したいと思っています。これは、個々の値を個別に処理するか、複数の "または"ステートメントをループで使用することで簡単に行うことができますが、それを行うためのより良い/より速い方法が必要であるように感じられます。私は実際のサイズの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

答えて

14

機能numpy.in1dは、あなたがやりたいようです。唯一の問題は、それが唯一の1Dアレイで動作することであるので、あなたはこのようにそれを使用する必要があります。これは、1D配列のみに限定されている理由

In [9]: np.in1d(fake, [0,2,6,8]).reshape(fake.shape) 
Out[9]: 
array([[ True, False, True], 
     [False, False, False], 
     [ True, False, True]], dtype=bool) 

私は見当もつかない。そのsource codeを見ると、最初は2つの配列が平坦化されているように見えますが、その後は巧妙なソート方法があります。しかし、私はここで手作業でしなければならなかったように、最後に結果を平坦化しないようにするものは何もありません。

+0

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

+0

いいえ、 'in1d'はcで書かれていませんが、Pythonでは、私が与えたソースコードへのリンクを見てください。 'sort'のような色々な関数を使います。これはC言語で書かれていなければなりません。' vals'が短いときに最適化されたアルゴリズムもあります。これはあなたの解法にかなり似ています(しかし ' + = ')。私はあなたのバージョンがより速い理由を知らない、これは両方の入力の長さに依存するかもしれない。 –

5

@ Basの答えはあなたが探しているものです。しかし、ここでそれを行うための別の方法は、numpyののvectorizeトリックを使用して、です:

import numpy as np 
S = set([0,2,6,8]) 

@np.vectorize 
def contained(x): 
    return x in S 

contained(fake) 
=> array([[ True, False, True], 
      [False, False, False], 
      [ True, False, True]], dtype=bool) 

このソリューションのconがcontained()は、各要素のために呼び出されることである(つまり、パイソン空間内)pure-よりもはるかに遅いこれになり、数の少ないソリューションです。

関連する問題