Skip to content

NumPy Zeros: np.zeros()로 제로로 채워진 배열 만들기

Updated on

배열을 0으로 초기화하는 것은 수치 컴퓨팅에서 가장 일반적인 연산 중 하나입니다. 루프에서 결과를 누적하기 위한 사전 할당 배열, 이미지 처리를 위한 제로 패딩 행렬, 신경망 가중치를 위한 플레이스홀더 텐서, 또는 시뮬레이션 상태를 위한 빈 그리드가 필요합니다. 0으로 채워진 Python 리스트를 사용하면 느리고 NumPy가 제공하는 수학 연산이 부족합니다.

np.zeros()는 지정한 데이터 타입을 사용하여 모든 형태의 배열을 0으로 채워 생성합니다. 빠르고 메모리 효율적이며, NumPy에서 배열을 초기화하는 표준 방법입니다.

📚

기본 사용법

1D 배열

import numpy as np
 
# 5개의 0으로 이루어진 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설명0의 모양요소당 메모리
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)모두 0기본 초기화
np.ones(shape)모두 1곱셈 단위원, 마스크
np.full(shape, value)모두 같은 값사용자 정의 채움 값
np.empty(shape)미초기화성능 (즉시 채울 때)
np.eye(n)단위 행렬선형 대수
np.zeros_like(arr)다른 배열과 일치하는 0입력과 일치하는 결과 배열
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까지 0으로 패딩 (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)은 개발 중에 배열 형태, dtype 및 메모리 사용량을 인터랙티브하게 검사할 수 있는 AI 기반 Jupyter 환경을 제공합니다.

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()는 모든 요소를 0으로 초기화합니다. 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()는 약간 더 빠릅니다. 0으로 초기화된 메모리를 직접 제공하는 OS 수준의 최적화된 메모리 할당(calloc)을 사용하기 때문이며, np.full()은 할당 후 채워야 합니다. 대부분의 실용적인 목적에서 차이는 무시할 수 있습니다.

결론

np.zeros()는 NumPy에서 제로로 채워진 배열을 만드는 표준 방법입니다. 사전 할당, 패딩, 누적 패턴, 초기화에 사용하세요. 기존 배열의 형태와 일치시켜야 할 때는 np.zeros_like()를 선택하세요. 메모리 사용량을 제어하려면 dtype을 지정하세요 -- float32float64의 절반 메모리를 사용합니다. 0이 아닌 초기화에는 필요에 따라 np.ones(), np.full(), 또는 np.empty()를 사용하세요.

📚