4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

多次元配列を一次元化する

Posted at

多次元配列であるリストまたは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関数をすすめる。

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?