np.zerosの使い方|0埋め配列を形状・データ型指定で作成

PythonでNumpyを使い始めた際、指定した形状やデータ型で0埋めされた配列を作成する方法が分からず、困ることはありませんか。
この記事を読めば、np.zerosの基本的な使い方から、実務で役立つ応用テクニックまで理解できます。
自分のプログラムに適したshape(形状)とdtype(データ型)で0埋め配列を生成し、計算の土台となる初期化処理をエラーなく実装できるようになります。

numpy.zerosとは?全要素が0の配列(行列)を生成する基本関数

numpy.zerosは、指定された形状(shape)とデータ型(dtype)を持つ、全ての要素が0の新しいNumPy配列(ndarray)を生成する関数です。
データ分析や機械学習の分野では、計算結果を格納するための「入れ物」を事前に用意しておくことが頻繁にあります。
numpy.zerosの基本的な使い方として、まず空のarrayを作成し、その後の処理で要素を更新していく、という流れが一般的です。

この関数は、配列を特定の値で初期化する際の基本操作の一つとして広く利用されます。
NumPy配列を同じ値で初期化する手法については「NumPy配列を同じ値で初期化する全手法!zeros・ones・full・fill」で詳しく紹介しています。

np.zerosの基本的な使い方と書き方

np.zerosを使用するには、まずNumPyライブラリをインポートします。
慣例として、「np」という別名を付けてimport numpy as npと記述します。
基本的な構文はnp.zeros(shape, dtype=float)です。

第一引数のshapeに作成したい配列の形状を、第二引数のdtypeにデータ型を指定します。
dtypeは省略可能で、その場合は浮動小数点数(float64)がデフォルトで設定されます。
Pythonのリストとは異なり、NumPyでは効率的な数値計算のために、最初に配列の大きさとデータ型を定義するのが一般的です様
Pythonのリスト・配列・numpy.ndarrayの違いについては「Pythonリスト・配列・numpy.ndarrayの違い」で詳しく紹介しています。

1次元配列(ベクトル)を0で初期化する方法

1次元の配列を作成するには、shape引数に整数を一つ渡します。
これにより、指定した要素数を持つ1次元のarrayが生成されます。
例えば、np.zeros(5)と実行すると、5つの要素がすべて0.0で埋められた配列[0.0.0.0.0.]が返されます。

dtypeを指定していないため、要素はデフォルトの浮動小数点数(float)になっている点がポイントです。
この方法は、ループ処理の結果を格納するベクトルを用意する際など、多くの場面で活用されます。

2次元配列(行列)を0で初期化する方法【タプルでの指定が重要】

2次元配列(行列)を作成する場合、shape引数に「(行数,列数)」という形式のタプルで形状を指定します。
例えば、3行4列の行列を生成するにはnp.zeros((3,4))のように記述します。
ここで重要なのは、形状をタプル(3,4)で指定するため、関数呼び出しのカッコと合わせて((3,4))のようにカッコが二重になる点です。

初心者がつまずきやすいポイントですが、「2次元以上のshapeはタプルで渡す」と覚えておけば、エラーを回避できます。

3次元以上の多次元配列を0で初期化する方法

3次元以上の多次元ndarrayを作成する場合も、2次元の時と考え方は同じです。
shape引数に、各次元の要素数をタプルで指定します。
例えば、(2,3,4)の形状を持つ3次元配列を作成するにはnp.zeros((2,3,4))と記述します。

これは「3行4列の行列が2つある」という構造を意味します。
このように、NumPyでは次元が増えても、タプル内の要素を増やすだけで直感的に多次元配列を初期化することが可能です。

用途に合わせてデータ型を指定するdtype引数の使い方

np.zeros関数では、dtype引数を使って配列の要素のデータ型を自由に指定できます。
この引数を省略した場合、データ型は自動的に浮動小数点数のfloat64になります。

しかし、整数しか扱わない場合や、メモリ使用量を抑えたい場合など、用途に応じて最適な型を選ぶことが重要です。
dtypeには’int’や’bool’、np.int32のように文字列やNumPyで定義された型オブジェクトを引数として渡します。

デフォルトの浮動小数点数(float)から整数(int)に変更する

配列の要素を整数で扱いたい場合は、dtype引数にintを指定します。
例えば、np.zeros(5,dtype=int)と実行すると、結果は[0 0 0 0 0]となり、小数点のつかない整数の配列が作成されます。
浮動小数点数が不要なカウント処理やインデックス管理などでは、明示的に整数型を指定することで、意図しない型変換を防ぎ、コードの信頼性を高められます。

メモリを効率化するデータ型(int8, float32など)の指定

特に大規模な配列を扱う場合、データ型はメモリ使用量に直接影響します。
NumPyでは、int8やint16、float32のように、各データ型が使用するビット数を細かく指定できます。
例えば、値の範囲が0から255に収まる画像データであれば、int64ではなくint8を使うことでメモリ消費を8分の1に抑えることが可能です。

このように、dtypeを適切に選択することは、計算資源を効率的に活用するための重要なテクニックです。

True/Falseを扱う真偽値(bool)で0埋め配列を作成する

データ型としてboolを指定することもできます。
np.zeros(5,dtype=bool)を実行すると、[False False False False False]という配列が生成されます。
これは、数値の0が真偽値のFalseに対応するためです。

この方法は、特定の条件を満たす要素を記録するためのマスク配列を作成する際の初期状態として利用されることがあります。
np.onesでTrueの配列を作成する操作と対になる使い方です。

既存の配列と同じ形状とデータ型で0埋めするnp.zeros_like

np.zeros_likeは、引数として渡された配列と全く同じ形状(shape)とデータ型(dtype)を持つ、全要素が0の新しい配列を生成する便利な関数です。
np.zerosのようにshapeやdtypeを手動で指定する必要がなく、既存の配列をテンプレートとして使えます。
これにより、コードが簡潔になり、元の配列の仕様変更にも自動で追従できる、保守性の高いプログラムを記述することが可能になります。
NumPyの空配列生成については「NumPy empty・empty_like完全攻略!空配列生成の効率的な使い方」で詳しく紹介しています。

np.zeros_likeの基本的な使い方

np.zeros_likeの使い方は非常にシンプルです。
まず、基準となるNumPy配列を用意します。
次に、その配列を引数としてnp.zeros_like()に渡します。

例えば、a=np.array([,])という配列がある場合、b=np.zeros_like(a)を実行すると、bにはaと同じ2行2列の形状と整数型を持つ[,]という配列が生成されます。

なぜzeros_likeが便利なのか?コードの可読性と保守性を高める理由

zeros_likeが便利な最大の理由は、コードの保守性と可読性を向上させる点にあります。
例えば、処理の元となる配列original_arrayの形状が将来変更される可能性がある場合を考えます。
np.zeros(original_array.shape)と書く代わりにnp.zeros_like(original_array)と記述すれば、original_arrayの変更に合わせて0埋め配列の形状も自動で変わるため、修正の手間が省けます。

「この配列と同じような(like)ものを作る」という関数の意味がコードの意図を明確にし、第三者にも分かりやすい記述になります。

np.zerosはいつ使う?実務での代表的な活用パターン

np.zerosの使い方は、単に0の配列を作ることにとどまりません。
実際のデータ分析や科学技術計算の現場では、より高度な処理を行うための下準備として重要な役割を担っています。
計算結果を格納する「器」を用意したり、データの前処理を行ったりと、さまざまな場面で活用されています。

ここでは、実務でよく見られる代表的な活用パターンをいくつか紹介します。

ループ計算の結果を格納するためのプレースホルダーとして利用する

forループなどの繰り返し処理で得られる計算結果を格納するために、あらかじめnp.zerosで適切なサイズの配列を用意しておく、という使い方は非常に一般的です。
Pythonのリストにappendで要素を追加していく方法に比べ、最初にメモリ領域を確保しておくことで処理速度が向上します。
計算結果を、作成したarrayの各要素へインデックス指定で直接代入していくことで、効率的なデータ格納が実現できます。

画像データの前処理(ゼロパディング)で活用する

画像データは、多くの場合、ピクセル値を要素とする多次元配列(ndarray)として扱われます。
特に、ディープラーニングの画像認識タスク(CNN)などでは、畳み込み演算を行う前に画像の周囲を0のピクセルで埋める「ゼロパディング」という前処理が施されます。
このパディング部分を作成するためにnp.zerosが活用されます。

元の2次元画像データの上下左右に、0で埋められた配列を結合することで、画像サイズを調整します。
NumPyでのRGB画像処理については「NumPyでRGB画像処理:色チャンネル分離・単色化・白黒化・色」で詳しく紹介しています。

機械学習モデルの重みやバイアスの初期化に使う

ニューラルネットワークなどの機械学習モデルでは、学習を開始する前に「重み」や「バイアス」といったパラメータを何らかの値で初期化する必要があります。
その初期化手法の一つとして、全てのパラメータを0で埋める方法があり、その際にnp.zerosが使われます。
適切な形状のndarrayをnp.zerosで作成し、モデルの各パラメータに代入します。

ただし、対称性を崩すために乱数で初期化する方が望ましいケースも多く、ゼロ初期化は特定の状況で選択される手法です。

np.zerosと他のNumpy初期化関数との違いを比較

NumPyには、配列を初期化するための関数がnp.zeros以外にもいくつか用意されています。
例えば、全要素を1で埋めるnp.onesや、任意の値で埋めるnp.full、そして初期化処理を省略して高速にメモリを確保するnp.emptyなどがあります。

これらの関数はそれぞれに特徴があり、目的や状況に応じて適切に使い分けることで、より効率的で可読性の高いコードを書くことができます。

全要素を1で初期化するnp.ones

np.onesは、np.zerosの姉妹的な関数で、全要素が0ではなく1の配列を生成します。
使い方はnp.zerosと全く同じで、shape引数で形状を、dtype引数でデータ型を指定します。
例えば、乗算の単位元として利用したり、全ての要素が有効であることを示すマスク配列として利用したりする場合に便利です。

np.ones(5,dtype=int)はという配列を返します。

任意の値で初期化するnp.full

np.fullは、指定した任意の値で全要素を埋めた配列を作成する関数です。
np.full(shape,fill_value)のように、形状と埋めたい値を引数に取ります。
例えば、全要素を7で初期化したい場合はnp.full((2,3),7)のように記述します。

np.zeros(shape)はnp.full(shape,0)と、np.ones(shape)はnp.full(shape,1)と実質的に同じ処理ですが、0や1で初期化する場合は専用の関数を使う方が一般的です。

初期化せず高速に配列を確保するnp.empty

np.emptyは、指定された形状のarrayを生成しますが、要素の初期化を行いません。
そのため、配列の各要素には、そのメモリ領域にもともと存在していたランダムな値が入っています。
初期化のステップを省略する分、np.zerosやnp.onesよりも高速に動作します。

後続の処理で配列の全要素が必ず上書きされることが分かっている場合に、パフォーマンスを最大化するために使用されます。

目的別|zeros, ones, full, emptyの使い分けガイド

これらの初期化関数の使い分けは、目的によって明確になります。
np.zeros:加算の単位元、ループ結果の格納用プレースホルダー、Falseを表すマスク配列として使う。
np.ones:乗算の単位元、Trueを表すマスク配列、係数の初期値として使う。

np.full:0や1以外の特定の定数(-1など)で配列を初期化したい場合に使う。
np.empty:処理速度が最優先で、後から全要素に必ず値を代入する、と決まっている場面で使う。
この基本的な使い方を理解することで、状況に応じた最適な関数を選択できます。

ゲーム開発で学ぶ!Python講座でのNumpy活用事例

np.zerosのようなNumPyの関数は、データサイエンスだけでなく、ゲーム開発のような分野でも強力なツールとなります。
例えば、Pythonプログラミングスクール「テックジム」の基礎コースでは、「間違い探しゲーム」や「野球シミュレーションゲーム」といったプロジェクトを通じて、Numpyを含む実践的なPythonスキルを習得します。
ゲームのマップや盤面をnp.zerosで初期化した2次元配列で表現したり、キャラクターの能力値を配列で管理したりと、楽しみながらNumpyの活用法を体得できるのが特徴です。

理論だけでなく、実際に手を動かして何かを作り上げる経験が、スキルの定着につながります。
Pythonプログラミングスクールの詳細については「Pythonプログラミングスクール概要」で詳しく紹介しています。

numpy.zerosに関するよくある質問

np.zerosの使い方を学ぶ上で、特にプログラミング初学者が疑問に思いがちな点をQ&A形式で解説します。
これらのよくある質問への回答を理解することで、よりスムーズに関数を使いこなせるようになります。

np.zeros((3, 4))のようにカッコが二重になるのはなぜですか?

np.zerosの最初の引数(shape)が、配列の形状をタプルで受け取る仕様だからです。
1次元配列の場合はnp.zeros(5)のように整数を渡せますが、2次元以上の配列を作る際はnp.zeros((3,4))のように形状を(3,4)というタプルで渡す必要があります。

このタプルを記述するためのカッコと、関数を呼び出すためのカッコが重なるため、結果として二重に見える、という意味です。

np.zerosで作成した配列のデータ型を整数(int)にするにはどうすれば良いですか?

第2引数のdtypeにintを指定します。
np.zeros(5,dtype=int)のように記述することで、要素が整数の0で初期化された配列を作成できます。
dtypeを省略した場合、デフォルトの型は浮動小数点数(float)になるため、整数として扱いたい場合は明示的な指定が必要です。

np.zerosとnp.zeros_likeはどのように使い分ければ良いですか?

新しく形状を指定して配列を作るならnp.zerosを、既存の配列と同じ形状・データ型で配列を作りたいならnp.zeros_likeを使います。
zeros_likeは、参照元の配列の仕様変更に自動で追従できるため、コードの保守性を高めたい場合に特に有効です。
例えば、ある配列xの計算結果を格納する配列yを作る際、y=np.zeros_like(x)としておけば、xの形状が変わってもyのコードを修正する必要がありません。

まとめ

この記事では、Numpyのnp.zeros関数の使い方について解説しました。
重要なポイントは以下の通りです。
shape引数で配列の形状を指定し、2次元以上の場合はタプルで渡す。
dtype引数でデータ型を整数(int)や真偽値(bool)などに変更できる。

np.zeros_likeは、既存の配列をテンプレートとして0埋め配列を作成する際に便利。
ones、full、emptyといった類似関数と、目的に応じて使い分ける。
Pythonで数値計算やデータ分析を行う上で、np.zerosの使い方をマスターすることは基本中の基本です。
この関数を自在に使いこなし、効率的なプログラミングを実現してください。

人気のPython講座・スクールならテックジム|初心者におすすめの実践型Python講座

テックジムPython基礎コース(初心者向け)