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

本記事では、

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

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

np.zeros

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

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

params:

パラメータ名 概要
shape intまたは
intのタプル
生成する配列のshapeを指定します。
dtype dtype
データ型
(省略可能)初期値float
生成される配列のshapeを指定します
デフォルトはfloatとなっています。
order ‘C’または’F’ (省略可能)初期値’C’
C/Fのいずれかを指定します。デフォルトはC。ローメジャー(Cスタイル)かカラムメジャー(Fortranスタイル)でメモリ配置します。
like コレクション NumPy配列以外の参照オブジェクトで生成します。__array_function__プロトコルを継承しているオブジェクトを指定することができます

returns:

指定されたshapeを持つ、0を要素とするndarrayが返されます。

zerosの引数には、第一引数に生成したい配列のshape、第二引数にデータ型(デフォルトはfloat64)、第三引数にorderを指定します。第3引数はFortranのような順序を指定する場合に使われるものであまり使用されません。第4引数は配列に相当するものを指定します。また、今回のように要素が全て同じである場合、見た目上の違いは全くありません。

基本的な使い方

それでは、実際にコードで使い方を見ていきましょう。

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との違い

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, shape=None)

params:

パラメータ名 概要
a array_like
(配列に相当するもの)
生成する配列のshapedtypeを持つndarrayを指定します。
dtype dtype
データ型
(省略可能)初期値None
結果のデータ型を上書きします。
order ‘C’,’F’,’A’,’K’
のいずれか
(省略可能)初期値’K’
C/F/A/Kのいずれかを指定します。デフォルトはK。配列のデータの並べ方を指定します。Kであれば出来る限り元の配列の並べ方を継承します。
subok bool値 (省略可能)初期値True
このオプションがTrueだった場合は、aのサブクラスのデータ型でndarrayが生成されます。
shape intまたはintのシーケンス 結果のshapeを上書きする。order=’K’かつ次元数が変更されない場合、順序を維持しようとする。
それ以外の場合はorder=’C’が適用される

returns:

aと同様のshapeを持つ、0を要素とするndarrayが返されます。

元の配列と同じ形状の配列を生成する

元のndarrayと同様のshapeを生成したいときに、以下のようなコードを書いている場合は、np.zeros_likeを使ったほうがスッキリするかもしれません。

b = np.zeros(a.shape)

このようなコードは、元のndarrayと同じshapeをもつ配列を生成することを目的として書いているはずなので、以下のようにnp.zeros_likeを使うことができます。

b = np.zeros_like(a)