※記事内に商品プロモーションを含むことがあります。
はじめに
NumPyのempty関数を用いて、np.empty(0), np.empty([0, 0]), …とすることで、空の(要素を持たない)任意の次元の配列を作成できる。本記事では、空の配列の作り方、使い方について簡単に考察する。
環境
- NumPy 1.19
本記事では、以下の通りライブラリをインポートしていることを前提とする。
|
|
np.emptyについて
np.emptyは中身を初期化せずに配列を作成する関数である。主な引数は次の通り。
|
|
shapeは配列の形状を決める引数であり、
- int
- intを格納するタプル
- intを格納するリスト
のいずれかをとる。
dtypeは配列の数値の型を決める引数であり、
intfloatnp.float32np.int8
などを指定する(デフォルトはfloat)。
要素数が5つの1次元配列を生成するには、shapeを5、または(5)、または[5]とする。ただし、配列の中身は変わる場合がある。
|
|
要素数が2×3の2次元配列を生成するには、shapeを(2, 3)、または[2, 3]とする。
|
|
np.empty()は、中身が全て0の配列を生成するnp.zeros()や、中身が全て1の配列を生成するnp.ones()と比較すると、配列を高速に生成できる利点がある。
空の配列の生成
冒頭に記したように、np.empty()のshapeを0や[0, 0], …とすると、任意の次元の空の配列を生成できる。
1次元配列の場合
|
|
2次元配列の場合
|
|
同様に、
np.empty([0, 0, 0])で3次元の空の配列np.empty([0, 0, 0, 0])で4次元の空の配列
がそれぞれ生成できる。
なお、np.zeros()関数やnp.ones()関数を使って、
np.zeros(0)np.ones([0, 0])
としても、同様に空の配列を作成できる。しかし、関数名と異なり要素に0や1を含まない配列が生成されて紛らわしいため、np.empty()関数を使うべきだと個人的に思う。
空の配列の使い方
空の配列は、「配列を結合したいが、最終的に得られる配列のサイズが分からない場合」、あるいは「計算の規模が小さく、かつプログラムの可読性を重視したい場合」に用いるべきである。
配列を逐次的に結合すると、その都度メモリを確保する必要があるため、実行速度が低下する。
そのため、最終的な配列のサイズが分かっている場合には、初めに必要なサイズの配列を確保して、逐次的に配列を代入した方が速く実行できる。
比較のため、配列を結合する関数stack()と、最初に配列を確保する関数substitute()を作成した。両者とも、長さが1000で要素が全て1の配列を返す。関数stack()では長さ1の配列を1000回結合し、関数substitute()では最初に確保した配列に長さ1の配列を1000回代入している。
|
|
IPythonの%timeitマジックコマンドで実行速度を測定する。
|
|
stack()関数とsubstitute()関数の平均実行時間はそれぞれ5.93ミリ秒と0.436ミリ秒であり、substitute()の方が約14倍高速である。すなわち、処理速度を重視する場合、最初に配列を確保した方が良い。