NumPy

NumPy Quickstart チュートリアルに取り組む (5-1) 高度なインデックス作成とトリック インデックスの配列によるインデックス作成(2)

インデックス作成のもう一つの一般的な使用法は、時間依存系列の最大値の検索。

import numpy as np
time = np.linspace(20, 145, 5)                 # time scale
data = np.sin(np.arange(20)).reshape(5,4)      # 4 time-dependent series
print(time)
# [ 20.    51.25  82.5  113.75 145.  ]

print(data)
'''
[[ 0.          0.84147098  0.90929743  0.14112001]
 [-0.7568025  -0.95892427 -0.2794155   0.6569866 ]
 [ 0.98935825  0.41211849 -0.54402111 -0.99999021]
 [-0.53657292  0.42016704  0.99060736  0.65028784]
 [-0.28790332 -0.96139749 -0.75098725  0.14987721]]
'''

ind = data.argmax(axis=0)
print(ind)
# [ 2 0 3 1 ]

time_max = time[ind]

data_max = data[ind, range(data.shape[1])] # => data[ind[0],0], data[ind[1],1]...

print(time_max)
# [ 82.5   20.   113.75  51.25]

print(data_max)
# [0.98935825 0.84147098 0.99060736 0.6569866 ]

print(np.all(data_max == data.max(axis=0)))
# True

代入先として配列を使ったインデックスを使うこともできる。

import numpy as np
a = np.arange(5)
print(a)
# [0 1 2 3 4]

a[[1,3,4]] = 0
print(a)
# [0 0 2 0 0]

インデックスのリストに繰り返しが含まれている場合は、最後の値を残して何度か代入が行われる。

a = np.arange(5)
a[[0,0,2]]=[1,2,3]
print(a)
# [ 2 1 3 3 4 ]

Pythonの+=構造体を使いたい場合は注意が必要。

a = np.arange(5)
a[[0,0,2]]+=1
print(a)
# [ 1 1 3 3 4 ]

インデックスのリストで0が2回あるにもかかわらず、0番目の要素は1回しかインクリメントされない。(Pythonでは “a+=1 “が “a = a + 1 “と等価であるため)