np.zerosは、0で初期化されたndarrayを生成する関数です。NumPyの配列生成関数には様々な方法があるので、頭を悩ませるかもしれません。

本記事では、

  • np.zerosの使い方
  • np.emptynp.zeros_likeとの違い

について紹介します。使い方をハッキリと理解するだけで、コードが格段に綺麗になるはずです。

np.zeros

np.zerosは、関数の名前から想像できる通り、すべての要素を0とする配列を生成するものです。APIドキュメント以下のようになっています。

numpy.zeros(shape, dtype = float, order = ‘C’)

params:

パラメータ名 概要
shape intまたは
intのタプル
生成する配列のshapeを指定します。
dtype data-type
データ型
生成する配列の要素のデータ型を指定します。
デフォルトはfloat64となっています。
order string 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.emptynp.zeros_likeとの違い

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 生成する配列のshapedtypeを持つndarrayを指定します。
dtype data-type
データ型
生成する配列の要素のデータ型を指定します。
デフォルトはaのデータ型を継承します。
order string C/F/AorKのいずれかを指定します。デフォルトはK。配列のデータの並べ方を指定します。Kであれば出来る限り元の配列の並べ方を継承します。
subok bool このオプションが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)