こんにちは、タナカです。
この記事では、ある配列の値を事前に準備した割当表に基づいて置換する方法を紹介します。
具体的なイメージとしては、この割当表に基づいて下記の配列を置換します。
割当表: {0: 10, 1: 23, 2: 27, 3: 30, 4: 34, 5: 41, 6: 57, 7: 85}
[3 0 0 1 2 4 4 0 5 7 0 6 0 0 0 3 0 6 ]
↓
[30 10 10 23 27 34 34 10 41 85 10 57 10 10 10 30 10 57]
例えば、3という値は割当表に従うと30に置換され、0という値は10に置換されます。
今回はfor文で置換する方法とnumpyを使って置換する方法の2つの方法を紹介しています。
ではいきましょう。
numpy配列の値を割当表に基づいて置換する方法がわかる
1. for文で置換する方法
かなり力技なやり方になります。
for文を使って一つひとつ数字を取り出して、一致していれば置換するといったやり方です。for文を使うことになるので、配列の数が多くなればなるほど処理時間がかかります。
実際のコードがこちらになります。
import numpy as np
target_array = np.array([3, 0, 0, 1, 2, 4, 4, 0, 5,
7, 0, 6, 0, 0, 0, 3, 0, 6])
allocation_dict = {0: 10, 1: 23, 2: 27, 3: 30, 4: 34, 5: 41, 6: 57, 7: 85}
replace_list = []
for target_value in target_array:
for key in allocation_dict:
if target_value == key:
replace_value = allocation_dict[key]
replace_list.append(replace_value)
replace_array = np.array(replace_list)
print(str.format('target_array: {}', target_array))
print(str.format('replace_array: {}', replace_array))
# >> target_array: [3 0 0 1 2 4 4 0 5 7 0 6 0 0 0 3 0 6]
# >> replace_array: [30 10 10 23 27 34 34 10 41 85 10 57 10 10 10 30 10 57]
ちなみにfor文の場合での処理時間は、1~10までの値を1,000,000個持つ配列を置換させたときで約15sです。(私のPCの場合)
2. numpyのvectorizeメソッドを使って置換する方法
numpyを使う場合は、vectorizeメソッドを使います。vectorizeの説明についてはこちらの記事が参考になりました。
実際のコードがこちらになります。
import numpy as np
def replace_func(allocation_dict, target_array):
if target_array in allocation_dict:
return allocation_dict[target_array]
else:
return target_array
target_array = np.array([3, 0, 0, 1, 2, 4, 4, 0, 5,
7, 0, 6, 0, 0, 0, 3, 0, 6])
allocation_dict = {0: 10, 1: 23, 2: 27, 3: 30, 4: 34, 5: 41, 6: 57, 7: 85}
vec_func = np.vectorize(replace_func)
replace_array = vec_func(allocation_dict, target_array)
print(str.format('target_array: {}', target_array))
print(str.format('replace_array: {}', replace_array))
# >> target_array: [3 0 0 1 2 4 4 0 5 7 0 6 0 0 0 3 0 6]
# >> replace_array: [30 10 10 23 27 34 34 10 41 85 10 57 10 10 10 30 10 57]
ちなみにnumpyを使った場合での処理時間は、1~10までの値を1,000,000個持つ配列を置換させたときで約0.27sです。(私のPCの場合)
まとめ
今回は、配列の値を割当表に基づいて置換する方法を紹介しました。
置換したい数が多くなる場合は、numpyを使う方が処理時間的にも有利な結果でした。実際に実用的なものはnumpyだと思います。
ただし、for文でも分かりやすさといった面でも何かしらの使い道があるも事実です。
今回紹介した方法以外にも、もちろん様々な実装方法があると思うので、自分に合った方法でプログラミングしていこうと思います。