numpy.arrayの任意の次元に対する反復処理
2023-09-26 14:42:17
質問
numpy配列の任意の次元に対するイテレータを取得する関数はありますか?
1次元のイテレートは簡単です...。
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)みたいな名前の関数がないのが不思議です。
どのように解決するのですか?
ご提案いただいた方法は非常に高速ですが、フォームをより明確にすることで、読みやすさを向上させることができます。
for i in range(c.shape[-1]):
print c[:,:,i]
または、より良い(より速く、より一般的で、より明示的)。
for i in range(c.shape[-1]):
print c[...,i]
しかし、上記の最初のアプローチでは、約 2 倍の速度で
swapaxes()
のアプローチよりも約2倍遅いようです。
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]
の処理は一般的なコードで行われる可能性があるため (そのコードは
:
がより複雑なスライスに置き換わる場合を扱う) 一般的なコードによって行われるかもしれません。
しかし、より明示的な第二の解である
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
関連
-
[解決済み] PandasでDataFrameの行を反復処理する方法
-
[解決済み] 反復処理中にリストから項目を削除するには?
-
[解決済み] Javaでenumを繰り返し処理するためのforループ
-
[解決済み] Javaでリストを反復処理する方法
-
[解決済み] 一般的なリストを繰り返しながら、そのリストから要素を削除するには?
-
[解決済み] マップの全キーに対する反復処理
-
[解決済み】forループを使った辞書の反復処理
-
[解決済み] SQLAlchemy - テーブルのリストを取得する
-
[解決済み] Pandasのデータフレーム内の文字列を'date'データ型に変換するにはどうしたらいいですか?
-
[解決済み] あるメソッドが複数の引数のうち1つの引数で呼び出されたことを保証する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] PythonでSVGからPNGに変換する
-
[解決済み] PythonからSMTPを使用してメールを送信する
-
[解決済み] Pythonで0xを使わずにhex()を使うには?
-
[解決済み] SQLAlchemy - テーブルのリストを取得する
-
[解決済み] あるオブジェクトが数であるかどうかを確認する、最もパイソン的な方法は何でしょうか?
-
[解決済み] Python Logging でログメッセージが2回表示される件
-
[解決済み] djangoフレームワークでフォームフィールドから値を取得するには?
-
[解決済み] あるメソッドが複数の引数のうち1つの引数で呼び出されたことを保証する
-
[解決済み] Pythonの辞書にあるスレッドセーフについて
-
[解決済み] pipの依存性/必要条件をリストアップする方法はありますか?