多次元配列であるリストまたはarrayを一次元化する。
理想は下のようなコードがあればいい。
Flatten.py
F = [[1, 2, 3], [4, 5], [6], [7, 8, 9, 10]]
def flatten():
pass
print(flatten(F))
#=>[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
調べてみると、Numpyに似たような関数を見つけることができた。
np.ravel.py
A = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
print(np.ravel(A))
#=>[1 2 3 4 5 6 7 8 9]
または
np.flatten.py
A = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
A = np.array(A)
print(A.flatten())
#=>[1 2 3 4 5 6 7 8 9]
実際にもとの多次元配列で試す。
np.ravel.py
F = [[1, 2, 3], [4, 5], [6], [7, 8, 9, 10]]
np.ravel(F)
#=>array([list([1, 2, 3]), list([4, 5]), list([6]), list([7, 8, 9, 10])],dtype=object)
このように一次元配列にすることができなかった。np.flattenでも同様な結果となってしまった。
Numpyのこれらの関数は行列のベクトル化で使われるのだろう。
そこで最後にsum関数を使ってみる。
sum関数は組み込み型とNumpyの2種類がある。
sum.py
F = [[1, 2, 3], [4, 5], [6], [7, 8, 9, 10]]
sum(F, [])
#=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
np.sum(F, axis=0)
#=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
このようにsum関数を使えば多次元配列の一次元化をすることができた。
大きな多次元配列を扱うとき、組み込み型のsum関数を使うとメモリ不足のせいかフリーズしてしまった。しかしNumpyのsum関数は比較的早く処理できた。
例として、100個のベクトルが合わさった全部で5000万以上の要素のある多次元配列では約37秒で処理を終えた。
したがって、一次元化する時はNumpyのsum関数をすすめる。