17

整数の配列があり、その配列が複数の値のリスト内の任意の値と等しい場所を見つけたいと考えています。

これは、各値を個別に処理するか、ループ内で複数の「or」ステートメントを使用することで簡単に実行できますが、より良い/より高速な方法が必要だと感じています. 私は実際に size の配列を扱っています4000 x 2000が、ここに問題の簡略版があります:

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)

私が望むのは、値のリストをwant含む単一のコマンドから取得する方法です。fake[0, 2, 6, 8]

これが既に含まれているパッケージがあり、Python でループを使用して関数を記述した場合よりも大幅に高速になると想定しています。

4

3 に答える 3

17

関数numpy.in1dは、あなたが望むことをしているようです。唯一の問題は、1 次元配列でしか機能しないことです。したがって、次のように使用する必要があります。

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)

これが1次元配列のみに限定されている理由がわかりません。ソース コードを見ると、最初に 2 つの配列がフラット化され、その後、いくつかの巧妙なソート トリックが実行されているように見えます。しかし、ここで手動で行わなければならなかったように、最後に結果が再び平坦化されないようにすることは何もありません。

于 2013-10-23T18:37:22.390 に答える
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)

このソリューションの短所は、contained()要素ごとに (つまり、python-space で) 呼び出されることです。これにより、純粋な numpy ソリューションよりもはるかに遅くなります。

于 2013-10-23T18:41:34.323 に答える