色々できそうだが、基本的な使い方だけメモ。
numpy.nditer — NumPy v1.12 Manual
何するの、これ? と思ったけど、使ってみた。まずはコードから。
np_array = np.random.randn(2, 3) print(np_array) nditer = np.nditer(np_array, flags=['multi_index']) while not nditer.finished: print(nditer.multi_index) print(np_array[nditer.multi_index]) nditer.iternext()
結果
# 最初のprint() [[-1.74892591 -0.59628881 0.05522772] [ 1.31665726 1.22965398 -0.41140946]] # whileループ (0, 0) -1.7489259098 (0, 1) -0.596288812217 (0, 2) 0.0552277235215 (1, 0) 1.31665726393 (1, 1) 1.229653983 (1, 2) -0.411409464808
なるほどー。何が便利かわからん。。。と思ったけど、numpyの次元が増えた時、2〜重ループとかしなくてもいいのね。納得。
5行1列(2次元)
np_array = np.random.randn(5, 1) print(np_array) nditer = np.nditer(np_array, flags=['multi_index']) while not nditer.finished: print(nditer.multi_index) print(np_array[nditer.multi_index]) nditer.iternext()
[[-0.12610291] [-1.69087957] [ 0.03920609] [ 0.19390889] [ 0.05827795]] (0, 0) -0.126102914336 (1, 0) -1.69087956683 (2, 0) 0.0392060881481 (3, 0) 0.193908885096 (4, 0) 0.0582779462146
画像っぽい値で。2行2列3の値(3次元)
np_array = np.random.randn(2, 2, 3) print(np_array) nditer = np.nditer(np_array, flags=['multi_index']) while not nditer.finished: print(nditer.multi_index) print(np_array[nditer.multi_index]) nditer.iternext()
[[[ 0.40570373 0.29383617 0.19770627] [-0.35118724 0.64944819 -0.85610483]] [[-0.99811347 -0.3842173 -0.40674939] [-0.28392354 1.00559893 -0.36640248]]] (0, 0, 0) 0.405703731115 (0, 0, 1) 0.293836169251 (0, 0, 2) 0.197706273648 (0, 1, 0) -0.351187235594 (0, 1, 1) 0.649448185325 (0, 1, 2) -0.856104830751 (1, 0, 0) -0.998113470526 (1, 0, 1) -0.384217298371 (1, 0, 2) -0.406749392256 (1, 1, 0) -0.283923537977 (1, 1, 1) 1.0055989324 (1, 1, 2) -0.366402477684
すばらしい!!!