【NumPy入門 np.ndarray.flatten】多次元配列を一次元配列にしてみよう

この記事では、NumPyのflatten関数について紹介します!

flattenという関数、他の様々なプログラミング言語に実装されている機能で、「多次元配列を一次元配列に変換する」という機能を持ちます。

例えばこの関数は、「二次元配列として表現されている画像データを一次元配列に変換してSVMに入力する」などの場面で活躍します。

この記事の要点は

  1. flattenは多次元配列を一次元配列に変換する関数である
  2. flattenは出力に新しい配列を作るので、その分だけnp.ravelより遅い

の二点です。

この解説にピンと来なかった方、この記事でflattenについて勉強しましょう!

ndarray.flattenの使い方

※この記事のコードは、jupyter notebookjuputer labを使って書かれています。
コードを試すときは是非これらを使ってみてください。

flattenはndarray(np.array)のメソッドです。

似た機能をもつravelと違い、np.ravel/ndarray.ravelのように関数もメソッドもあるというわけではないので、ここだけ注意です。

# コード In [1]:
import numpy as np
# コード In [2]:
a = np.arange(12).reshape(4,-1)

# Jupyterではprint関数を使わなくても、変数の中身を確認できますよ!
a
# 出力結果 Out [2]:
array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 6,  7,  8],
       [ 9, 10, 11]])

さて、flattenは多次元配列を一次元配列に変換してくれる関数です。

使い方は簡単、ndarrayオブジェクト.flatten()とすればOK!

# コード In [3]:
b = a.flatten()
# コード In [4]:
print("a: original")
print(a)

print("\nb") # 改行してから"b"という文字をprintします。
print(b)
# 出力結果 [4]:
a: original
[[ 0  1  2]
 [ 3  4  5]
 [ 6  7  8]
 [ 9 10 11]]

b
[ 0  1  2  3  4  5  6  7  8  9 10 11]

flattenとravelの違い

flattenは元の配列のコピーを返す関数

np.ravel関数同じように多次元配列を一次元配列に変換してくれました。

【NumPy入門 np.ravel】多次元配列を一次元配列にするravelの使い方
更新日 : 2020年5月8日

ですがravelは変換後の配列の要素を変更すると、元の配列の要素も変わってしまいましたね。

flattenの返り値は新しい配列なので、そのようなことが無いのがravelとの違いです。

# コード In [5]:
b[0] = 100
# コード In [6]:
print("a: original")
print(a)

print("\nb")
print(b)
# 出力結果 [6]:
a: original
[[ 0  1  2]
 [ 3  4  5]
 [ 6  7  8]
 [ 9 10 11]]

b
[100   1   2   3   4   5   6   7   8   9  10  11]

bの先頭要素を変更しましたが、aの先頭要素は変わっていませんね。

これがravel関数だとaの先頭要素も変わってしまいます。

flattenはravelより遅い

flattenは新しい配列を作るので、元の配列へのビューを返すだけのravelより動作が遅いことが知られています。

# コード In [7]:
c = np.arange(10000).reshape(10,100,10)
# コード In [8]:
# %%timeitコマンドでセル内のコードの実行時間を計測できます!
%%timeit

c.flatten()
# 出力結果 [8]:
2.4 µs ± 29.5 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
# コード In [9]:
%%timeit

c.ravel()
# 出力結果 [9]:
162 ns ± 2.15 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

機械学習などの実装において、元の配列を残して起きたい場合はflatten, 元の配列をそのまま使ってもいい場合はravelなどの使い分けをすることで、高速化できそうですね。

まとめ

この記事では、多次元配列を一次元配列に変換するメソッド、ndarray.flattenについて紹介しました。

ravelとの違い、わかっていただけたでしょうか。

新しい配列を作るかどうか、というのは非常に大きな違いです。

これらをしっかり理解して、flattenを機械学習や科学計算の実装の際に役立ててくれると嬉しいです!

プログラミング学習を効率良く進めたいなら…

学習を始めたけどエラーが解決できない
作りたいものはあるけど、何から始めればいいかわからない
プログラミングに対して、このような悩みを持っている方も多いですよね。

そんな方には、弊社が運営するサブスク型のプログラミングスクール「SAMURAI ENGINEER Plus+がおすすめです。



月額2980円(税別)で、主に4つのサービスを提供させていただきます。

  • 現役エンジニアによる月1度の「マンツーマン指導」
  • 平均回答時間30分の「Q&Aサービス」
  • 作りながら学べる28種類の「教材」
  • 学習を記録&仲間と共有できる「学習ログ」

目的にあった教材を選べば、どなたでも効率よく学習できるほか、Q&Aサービスやマンツーマン指導を活用することで、挫折せずにプログラミングの習得が可能です。

プログラミングを効率的に学びたい人はもちろん、何から始めたらよいのかわからない方は、ぜひ「SAMURAI ENGINEER Plus+」をご利用ください。
まずは30日無料体験

書いた人

フクロウ

第一言語はPythonです。
皆さんRustやりましょう。