페이지 불러오는 중
NumPy 배열을 저장·복원하는 방법입니다
① .npy/.npz 바이너리(빠르고 dtype·shape 그대로 보존), ② 텍스트/CSV(loadtxt, genfromtxt), ③ pandas와 상호 변환.
실무에서는 원천 데이터를 pandas로 읽고 → to_numpy()로 배열화 → NumPy로 전처리하는 흐름이 흔합니다.
import numpy as np.npy / .npz중간 결과물을 저장할 때 최선의 선택입니다. dtype, shape가 그대로 보존되고 로딩이 빠릅니다.
a = np.arange(12).reshape(3, 4)
# 단일 배열
np.save('arr.npy', a) # 확장자 .npy 자동 부여
loaded = np.load('arr.npy')
# 여러 배열을 한 파일에
np.savez('bundle.npz', train=a, labels=np.array([0, 1, 2]))
data = np.load('bundle.npz')
data['train'] # 저장 시 준 키로 접근
data['labels']
# 압축 저장 (용량 우선, 저장/로딩은 느려짐)
np.savez_compressed('bundle.npz', train=a)
np.load로.npz를 열면 실제로는 지연 로딩(lazy) 객체입니다. 파일 핸들을 닫으려면data.close()또는with np.load(...) as data:를 씁니다.
💡 이럴 때: 전처리 중간 산출물을 캐싱해 재실행 시간을 줄일 때. dtype·shape가 그대로 보존됩니다.
np.loadtxt : 결측 없는 깔끔한 수치 데이터, 빠름# data.csv:
# 1,2,3
# 4,5,6
arr = np.loadtxt('data.csv', delimiter=',')
arr = np.loadtxt('data.csv', delimiter=',', skiprows=1) # 헤더 스킵
arr = np.loadtxt('data.csv', delimiter=',', usecols=(0, 2)) # 특정 열만결측값이 하나라도 있으면 ValueError입니다. 이때는 genfromtxt를 씁니다.
np.genfromtxt : 결측 처리 지원, 느림arr = np.genfromtxt(
'data.csv',
delimiter=',',
names=True, # 첫 줄을 필드명으로 (구조화 배열 반환)
missing_values='', # 무엇을 결측으로 볼지
filling_values=np.nan, # 결측을 무엇으로 채울지
)현실 조언: CSV 파싱은 pandas(
pd.read_csv)가 압도적으로 빠르고 유연합니다. NumPy의 텍스트 IO는 "의존성 없이 간단한 파일을 읽어야 할 때"로 제한하고, 복잡한 CSV는 pandas로 읽어to_numpy()합니다.
💡 이럴 때: 의존성 없이 간단한 수치 CSV만 읽으면 될 때 loadtxt, 결측이 있으면 genfromtxt. 복잡한 파일은 pandas로.
import pandas as pd
df = pd.DataFrame({'a': [1, 2, 3], 'b': [4, 5, 6]})
# DataFrame → ndarray
arr = df.to_numpy() # 권장 (구방식 .values 대신)
arr = df['a'].to_numpy() # 단일 열 → 1차원 배열
# ndarray → DataFrame
pd.DataFrame(arr, columns=['a', 'b'])
# 배열 인터페이스로 변환
np.asarray(df)
# - 단일 dtype이고 메모리가 연속이면 복사를 피할 수 있으나,
# 혼합 dtype DataFrame은 항상 새 배열을 만든다 (object 또는 공통 상위 타입으로 승격)💡 이럴 때: pandas로 읽은 표를 NumPy 전처리 파이프라인에 넘길 때. 혼합 dtype이면 숫자 열만 골라 변환합니다.
to_numpy()하면 공통 상위 타입(대개 object 또는 float64)으로 승격됩니다. 숫자만 필요하면 숫자 열만 골라서 변환합니다.NaN, pd.NA)은 NumPy 배열로 오면 np.nan(float)이 되거나 object가 됩니다.
댓글
GitHub 계정으로 의견이나 질문을 남길 수 있습니다.