ITの隊長のブログ

ITの隊長のブログです。Rubyを使って仕事しています。最近も色々やっているお(^ω^ = ^ω^)

【Python】numpy.nditer()という関数

スポンサードリンク

色々できそうだが、基本的な使い方だけメモ。

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

すばらしい!!!