3

長さ 4 の配列の numpy 配列があるとします。

In [41]: arr
Out[41]:
array([[  1,  15,   0,   0],
       [ 30,  10,   0,   0],
       [ 30,  20,   0,   0],
       ...,
       [104, 139, 146,  75],
       [  9,  11, 146,  74],
       [  9, 138, 146,  75]], dtype=uint8)

私は知りたいです:

  1. arrを含むというのは本当[1, 2, 3, 4]ですか?
  2. それが本当なら、のどのインデックス[1, 2, 3, 4]ですかarr

出来るだけ早く調べたいです。

8550420arr個の要素が含まれているとします。私はいくつかの方法をチェックしましたtimeit

  1. index: を取得せずにチェックするためだけにany(all([1, 2, 3, 4] == elt) for elt in arr)。私のマシンでの10回の実行で平均15.5秒かかりました
  2. forベースのソリューション:

    for i,e in enumerate(arr): if list(e) == [1, 2, 3, 4]: break

    平均で約5.7秒かかりました

numpy ベースなど、より高速なソリューションはありますか?

4

2 に答える 2

0

検索を複数回実行し、余分なメモリを使用してもかまわない場合は、配列からセットを作成できます (ここではリストを使用していますが、ほとんど同じコードです)。

>>> elem = [1, 2, 3, 4]    
>>> elements = [[  1,  15,   0,   0], [ 30,  10,   0,   0], [1, 2, 3, 4]]
>>> index = set([tuple(x) for x in elements])
>>> True if tuple(elem) in index else False
True
于 2013-07-23T13:19:40.783 に答える