NumPy 配列の任意の次元の反復子を取得する関数はありますか?
最初の次元を反復するのは簡単です...
In [63]: c = numpy.arange(24).reshape(2,3,4)
In [64]: for r in c :
....: print r
....:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]
しかし、他の次元を反復するのは困難です。たとえば、最後の次元は次のようになります。
In [73]: for r in c.swapaxes(2,0).swapaxes(1,2) :
....: print r
....:
[[ 0 4 8]
[12 16 20]]
[[ 1 5 9]
[13 17 21]]
[[ 2 6 10]
[14 18 22]]
[[ 3 7 11]
[15 19 23]]
これを自分で行うためのジェネレーターを作成していますが、これを自動的に行う numpy.ndarray.iterdim(axis=0) のような関数がないことに驚いています。
ベストアンサー1
提案されているものは非常に高速ですが、より明確なフォームを使用することで読みやすさを向上させることができます。
for i in range(c.shape[-1]):
print c[:,:,i]
または、より良い方法(より高速、より一般的、より明示的):
for i in range(c.shape[-1]):
print c[...,i]
ただし、上記の最初のアプローチは、次のアプローチよりも約 2 倍遅いようですswapaxes()
。
python -m timeit -s 'import numpy; c = numpy.arange(24).reshape(2,3,4)' \
'for r in c.swapaxes(2,0).swapaxes(1,2): u = r'
100000 loops, best of 3: 3.69 usec per loop
python -m timeit -s 'import numpy; c = numpy.arange(24).reshape(2,3,4)' \
'for i in range(c.shape[-1]): u = c[:,:,i]'
100000 loops, best of 3: 6.08 usec per loop
python -m timeit -s 'import numpy; c = numpy.arange(24).reshape(2,3,4)' \
'for r in numpy.rollaxis(c, 2): u = r'
100000 loops, best of 3: 6.46 usec per loop
swapaxes()
これは、 がデータをコピーしないため、および の処理が一般的なコード ( がより複雑なスライスに置き換えられるc[:,:,i]
ケースを処理するコード) を通じて実行される可能性があるためだと推測します。:
ただし、より明示的な 2 番目のソリューションc[...,i]
は非常に読みやすく、非常に高速であることに注意してください。
python -m timeit -s 'import numpy; c = numpy.arange(24).reshape(2,3,4)' \
'for i in range(c.shape[-1]): u = c[...,i]'
100000 loops, best of 3: 4.74 usec per loop