Skip to content

NumPy Zeros: np.zeros()でゼロで埋められた配列を作成する

Updated on

ゼロでの配列初期化は数値計算で最も一般的な操作の一つです。ループで結果を蓄積するための事前割り当て配列、画像処理のためのゼロパディング行列、ニューラルネットワークの重みのためのプレースホルダーテンソル、シミュレーション状態のための空のグリッドが必要です。ゼロで埋められたPythonリストの使用は遅く、NumPyが提供する数学演算がありません。

np.zeros()は指定したデータ型を使用して、任意の形状のゼロで埋められた配列を作成します。高速でメモリ効率が良く、NumPyで配列を初期化する標準的な方法です。

📚

基本的な使い方

1D配列

import numpy as np
 
# 5つのゼロの1D配列を作成
a = np.zeros(5)
print(a)        # [0. 0. 0. 0. 0.]
print(a.dtype)  # float64 (default)
print(a.shape)  # (5,)

2D配列(行列)

import numpy as np
 
# 3行、4列
matrix = np.zeros((3, 4))
print(matrix)
# [[0. 0. 0. 0.]
#  [0. 0. 0. 0.]
#  [0. 0. 0. 0.]]
print(matrix.shape)  # (3, 4)

3D配列

import numpy as np
 
# 2層、3行、4列
tensor = np.zeros((2, 3, 4))
print(tensor.shape)  # (2, 3, 4)
print(tensor.size)   # 24 elements total

データ型の指定

デフォルトのdtypeはfloat64です。dtypeパラメータで変更できます:

import numpy as np
 
# 整数のゼロ
int_zeros = np.zeros(5, dtype=int)
print(int_zeros)       # [0 0 0 0 0]
print(int_zeros.dtype) # int64
 
# ブールのゼロ(False)
bool_zeros = np.zeros(5, dtype=bool)
print(bool_zeros)  # [False False False False False]
 
# 複素数のゼロ
complex_zeros = np.zeros(3, dtype=complex)
print(complex_zeros)  # [0.+0.j 0.+0.j 0.+0.j]
 
# 32ビット浮動小数点(メモリ節約)
small_zeros = np.zeros((1000, 1000), dtype=np.float32)
print(f"Memory: {small_zeros.nbytes / 1024 / 1024:.1f} MB")  # ~3.8 MB vs 7.6 MB for float64

一般的なデータ型

dtype説明ゼロの見た目要素あたりのメモリ
float6464ビット浮動小数点(デフォルト)0.8バイト
float3232ビット浮動小数点0.4バイト
int6464ビット整数08バイト
int3232ビット整数04バイト
boolブールFalse1バイト
complex128128ビット複素数0.+0.j16バイト

np.zeros_like() -- 既存の配列に合わせる

別の配列と同じ形状とdtypeのゼロ配列を作成します:

import numpy as np
 
original = np.array([[1, 2, 3], [4, 5, 6]], dtype=np.float32)
 
# 同じ形状とdtype
zeros_copy = np.zeros_like(original)
print(zeros_copy)
# [[0. 0. 0.]
#  [0. 0. 0.]]
print(zeros_copy.dtype)  # float32
print(zeros_copy.shape)  # (2, 3)
 
# dtypeを上書き
int_copy = np.zeros_like(original, dtype=int)
print(int_copy.dtype)  # int64

関連する初期化関数

関数作成するものユースケース
np.zeros(shape)すべてゼロデフォルトの初期化
np.ones(shape)すべて1乗法単位元、マスク
np.full(shape, value)すべて同じ値カスタム充填値
np.empty(shape)未初期化パフォーマンス(すぐに充填する場合)
np.eye(n)単位行列線形代数
np.zeros_like(arr)別の配列に合わせたゼロ入力に合わせた結果配列
import numpy as np
 
# 1の配列
print(np.ones((2, 3)))
# [[1. 1. 1.]
#  [1. 1. 1.]]
 
# Full(カスタム値)
print(np.full((2, 3), 7))
# [[7 7 7]
#  [7 7 7]]
 
# Empty(未初期化 -- より高速だがゴミが含まれる)
empty = np.empty((2, 3))  # Contents unpredictable
 
# 単位行列
print(np.eye(3))
# [[1. 0. 0.]
#  [0. 1. 0.]
#  [0. 0. 1.]]

実用的なユースケース

結果配列の事前割り当て

import numpy as np
 
# パフォーマンスのための事前割り当て(繰り返しの連結を回避)
n_iterations = 1000
results = np.zeros(n_iterations)
 
for i in range(n_iterations):
    results[i] = np.random.randn() ** 2
 
print(f"Mean: {results.mean():.4f}")
print(f"Std:  {results.std():.4f}")

混同行列

import numpy as np
 
def confusion_matrix(y_true, y_pred, n_classes):
    """Build a confusion matrix from predictions."""
    cm = np.zeros((n_classes, n_classes), dtype=int)
    for true, pred in zip(y_true, y_pred):
        cm[true][pred] += 1
    return cm
 
y_true = [0, 1, 2, 0, 1, 2, 0, 0, 1, 2]
y_pred = [0, 1, 1, 0, 2, 2, 0, 1, 1, 0]
 
cm = confusion_matrix(y_true, y_pred, 3)
print(cm)
# [[3 1 0]
#  [0 2 1]
#  [1 0 2]]

信号処理のためのゼロパディング

import numpy as np
 
signal = np.array([1, 2, 3, 4, 5])
 
# ゼロで長さ16まで埋める(FFTのための2の冪乗)
padded = np.zeros(16)
padded[:len(signal)] = signal
print(padded)
# [1. 2. 3. 4. 5. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 
# np.padを使用(より柔軟)
padded2 = np.pad(signal, (0, 11), mode='constant', constant_values=0)
print(padded2)

画像処理 -- ゼロパディング

import numpy as np
 
# 元の3x3画像
image = np.array([[1, 2, 3],
                  [4, 5, 6],
                  [7, 8, 9]])
 
# 1ピクセルのゼロパディングを追加
padded = np.zeros((5, 5), dtype=image.dtype)
padded[1:-1, 1:-1] = image
print(padded)
# [[0 0 0 0 0]
#  [0 1 2 3 0]
#  [0 4 5 6 0]
#  [0 7 8 9 0]
#  [0 0 0 0 0]]

累積パターン

import numpy as np
 
# ヒストグラムにカウントを累積
data = np.random.randint(0, 10, size=1000)
bins = np.zeros(10, dtype=int)
 
for value in data:
    bins[value] += 1
 
print("Histogram:")
for i, count in enumerate(bins):
    bar = '#' * (count // 5)
    print(f"  {i}: {bar} ({count})")

Jupyterでゼロ配列を探索する

ゼロ初期化配列を使用する数値アルゴリズムを構築する際、RunCell (opens in a new tab)はAI搭載のJupyter環境を提供し、開発中に配列の形状、dtype、メモリ使用量をインタラクティブに検査できます。

FAQ

NumPyでゼロの配列を作成するにはどうすればよいですか?

np.zeros(shape)を使用します。shapeは1Dの場合は整数、多次元の場合はタプルです。例えば、np.zeros(5)[0., 0., 0., 0., 0.]を作成し、np.zeros((3, 4))は3x4のゼロ行列を作成します。デフォルトのdtypeはfloat64です。

np.zerosとnp.emptyの違いは何ですか?

np.zeros()はすべての要素をゼロに初期化します。np.empty()は初期化なしでメモリを割り当てるため、そのメモリ位置に以前あったものが含まれます。np.empty()はわずかに高速ですが、読み取る前にすべての要素をすぐに充填する場合のみ安全です。

浮動小数点のゼロの代わりに整数のゼロを作成するにはどうすればよいですか?

np.zeros()dtype=intを渡します:np.zeros(5, dtype=int)はdtype int64で[0, 0, 0, 0, 0]を作成します。メモリ制御にはnp.int32np.int8などの特定の型も使用できます。

別の配列と同じ形状のゼロ配列を作成するにはどうすればよいですか?

np.zeros_like(existing_array)を使用します。これは入力配列の形状とdtypeをコピーします。np.zeros_like(arr, dtype=float)でdtypeを上書きできます。

np.zeros()はnp.full(shape, 0)より速いですか?

はい、np.zeros()はわずかに高速です。これはOS レベルの最適化されたメモリ割り当て(calloc)を使用してゼロ化されたメモリを直接提供するのに対し、np.full()は割り当ててから充填する必要があるためです。ほとんどの実用的な目的では、違いは無視できる程度です。

まとめ

np.zeros()はNumPyでゼロで埋められた配列を作成する標準的な方法です。事前割り当て、パディング、累積パターン、初期化に使用してください。既存の配列の形状に合わせる必要がある場合はnp.zeros_like()を選択してください。メモリ使用量を制御するためにdtypeを指定してください -- float32float64の半分のメモリを使用します。非ゼロの初期化には、ニーズに応じてnp.ones()np.full()、またはnp.empty()を使用してください。

📚