6

配列内のすべての要素のインデックスのリストを取得しようとしているので、1000 x 1000 の配列の場合、 [(0,0), (0,1),...,(999,999) になります。 ]。

これを行うための関数を作成しました。これは以下のとおりです。

def indices(alist):
    results = []
    ele = alist.size
    counterx = 0
    countery = 0
    x = alist.shape[0]
    y = alist.shape[1]
    while counterx < x:
        while countery < y:
            results.append((counterx,countery))
            countery += 1
        counterx += 1
        countery = 0
    return results

時間を計った後、実行に約650ミリ秒かかっていたため、かなり遅いように見えました(遅いラップトップで許可されています)。したがって、numpy には平凡なコーディングよりも高速にこれを行う方法が必要であると考え、ドキュメントを見て、次のことを試しました。

indices = [k for k in numpy.ndindex(q.shape)]
which took about 4.5 SECONDS (wtf?)
indices = [x for x,i in numpy.ndenumerate(q)]
better, but 1.5 seconds!

これを行うより速い方法はありますか?

ありがとう

4

3 に答える 3

10

どうnp.ndindexですか?

np.ndindex(1000,1000)

これは反復可能なオブジェクトを返します:

>>> ix = numpy.ndindex(1000,1000)
>>> next(ix)
(0, 0)
>>> next(ix)
(0, 1)
>>> next(ix)
(0, 2)

一般に、配列がある場合は、次の方法で反復可能なインデックスを作成できます。

index_iterable = np.ndindex(*arr.shape)

もちろん、次のnp.ndenumerateように実装できるものも常にあります。

def ndenumerate(arr):
    for ix in np.ndindex(*arr.shape):
        yield ix,arr[ix]
于 2013-06-28T20:14:47.187 に答える
4

itertoolsの使用を考えたことがありますか? 結果の反復子を生成し、ほぼ確実に最適な速さになります。

import itertools

a = range(1000)
b = range(1000)

product = itertools.product(a, b)

for x in product:
    print x

# (0, 0)
# (0, 1)
# ...
# (999, 999)

これは への依存を必要としないことに注意してくださいnumpyrangeまた、 0 から 999 までのリストを作成するの楽しい使い方にも注目してください。

于 2013-06-28T20:12:27.633 に答える
3

あはは!

numpy を使用して、2 つの配列のすべての組み合わせの配列を作成する

itertool.product を使用すると 330 ミリ秒かかるのに対し、41 ミリ秒で実行されます。

于 2013-06-29T20:51:47.773 に答える