np.zeros
は、0で初期化されたndarrayを生成する関数です。NumPyの配列生成関数には様々な方法があるので、頭を悩ませるかもしれません。
本記事では、
-
np.zeros
の使い方 -
np.empty
、np.zeros_like
との違い
について紹介します。使い方をハッキリと理解するだけで、コードが格段に綺麗になるはずです。
np.zeros
np.zeros
は、関数の名前から想像できる通り、すべての要素を0
とする配列を生成するものです。APIドキュメント以下のようになっています。
numpy.zeros(shape, dtype = None, order = ‘C’)
params:
パラメータ名 | 型 | 概要 |
---|---|---|
shape |
intまたは intのタプル |
生成する配列のshape を指定します。 |
dtype |
dtype データ型 |
(省略可能)初期値float 生成する配列の要素のデータ型を指定します。 デフォルトは float64 となっています。 |
order |
‘C’または’F’ | (省略可能)初期値’C’C /F のいずれかを指定します。デフォルトはC 。配列のデータの並べ方を指定します。 |
returns:
指定されたshape
を持つ、0
を要素とするndarrayが返されます。
zeros
の引数には、第一引数に生成したい配列のshape
、第二引数にデータ型(デフォルトはfloat64
)、第三引数にorder
を指定します。最後の3つ目の引数はFortranのような順序を指定する場合に使われるものであまり使用されません。また、今回のように要素が全て同じである場合、見た目上の違いは全くありません。
基本的な使い方
それでは、実際にコードで使い方を見ていきましょう。
In [1]: import numpy as np
In [2]: np.zeros(10) # 1次元配列で生成
Out[2]: array([ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
In [3]: np.zeros(10, dtype = int) # データ型をintに指定。
Out[3]: array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
In [4]: np.zeros((3,4)) # 3×4の2次元配列を生成。
Out[4]:
array([[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.]])
np.empty
、np.zeros
との違い
np.empty
NumPyには初期化時に使う関数としてnp.empty
という関数があります。np.empty
の関数は要素が0になっていることは保証されません。なので、0で初期化する必要のない場合には高速になることがあるので、こちらを使用することをオススメします。
キャッシュが効かないように生成するshape
を変更して、実行速度を計測してみます。
In [1]: import numpy as np
In [2]: def zeros():
...: for i in range(10000):
...: _ = np.zeros((1, i))
...:
In [3]: def empty():
...: for i in range(10000):
...: _ = np.empty((1, i))
...:
In [4]: %timeit zeros()
100 loops, best of 3: 17.5 ms per loop
In [5]: %timeit empty()
100 loops, best of 3: 4.65 ms per loop
np.empty
の方が3~4倍ほど高速ですね。
np.zeros_like
また、np.zeros_like
という関数もあります。こちらは、以下のようなAPIドキュメントになっています。
numpy.zeros_like(a, dtype=None, order=’K’, subok=True)
params:
パラメータ名 | 型 | 概要 |
---|---|---|
a |
array_like (配列に相当するもの) |
生成する配列のshape 、dtype を持つndarrayを指定します。 |
dtype |
dtype データ型 |
(省略可能)初期値None 生成する配列の要素のデータ型を指定します。 デフォルトは a のデータ型を継承します。 |
order |
‘C’,’F’,’A’,’K’ のいずれか |
(省略可能)初期値’K’C /F /A /K のいずれかを指定します。デフォルトはK 。配列のデータの並べ方を指定します。K であれば出来る限り元の配列の並べ方を継承します。 |
subok |
bool値 | (省略可能)初期値True このオプションがTrueだった場合は、 a のサブクラスのデータ型でndarrayが生成されます。 |
returns:
aと同様のshape
を持つ、0
を要素とするndarrayが返されます。
元の配列と同じ形状の配列を生成する
元のndarrayと同様のshapeを生成したいときに、以下のようなコードを書いている場合は、np.zeros_like
を使ったほうがスッキリするかもしれません。
b = np.zeros(a.shape)
このようなコードは、元のndarrayと形状が同じ関数を生成することを目的として書いているはずなので、以下のようにnp.zeros_like
を使うことができます。
b = np.zeros_like(a)