페이지 불러오는 중
ndarray는 배열 전체가 하나의 dtype으로 고정됩니다. 이 하나의 제약에서 세 가지 실무 이슈가 파생됩니다:
① 정수형의 오버플로(에러 없이 값이 순환), ② 결측값(np.nan)은 실수형에서만 표현 가능, ③ float32/float64 선택이 메모리와 정밀도를 좌우.
import numpy as npa = np.array([1, 2, 3])
a.dtype # dtype('int64') (Windows + NumPy 1.x는 int32)
np.array([1, 2, 3], dtype=np.float32)
np.array([1, 2, 3], dtype='uint8')기본 정수 dtype은 OS·NumPy 버전에 따라
int32또는int64입니다. 재현성이 중요하면 항상 명시합니다.
astypea = np.array([1.7, 2.3, 3.9])
a.astype(np.int64) # array([1, 2, 3])
# ← 반올림이 아니라 소수점 "절삭"(truncation)!
np.round(a).astype(np.int64) # array([2, 2, 4]) - 반올림하려면 명시적으로💡 이럴 때: 확률·점수를 정수 등급으로 바꿀 때는 절삭이 아니라
np.round후astype을 씁니다. 수백만 행에서 메모리를 줄이려float64 → float32로 낮추는 것도 같은 도구입니다.
astype은 기본적으로 복사본을 만듭니다(copy=True). copy=False를 주고 dtype이 이미 일치하면 복사를 건너뜁니다.1.9는 1이 됩니다 (floor가 아님).np.array([300]).astype(np.uint8) → 44 (300 % 256).np.array([1e20]).astype(np.int32)의 결과는 신뢰할 수 없습니다.np.array([300], dtype=np.uint8)처럼 생성 단계에서 범위를 벗어나면 OverflowError가 나지만, .astype은 위처럼 조용히 순환합니다 (→ Python - NumPy 12. 성능과 함정 §4).np.nan / np.inf — 결측·특수값np.array([1, 2, np.nan]) # dtype이 float64로 자동 승격됨
np.array([1, 2, np.nan], dtype=np.int64) # ValueError - 정수 배열에 nan 불가정수 컬럼에 결측이 섞여 들어오면, NumPy 단계에서는 어쩔 수 없이 float64로 올려야 합니다. (pandas의 Int64(nullable) 타입은 이 문제를 별도로 해결한 것입니다.)
np.nan == np.nan # False ← 절대 == 로 비교하지 말 것
np.nan != np.nan # True
np.isnan(np.array([1.0, np.nan, 3.0])) # array([False, True, False])💡 이럴 때: 결측 탐지는 항상
np.isnan()으로 합니다.== np.nan은 언제나 False라 조건이 조용히 무시됩니다.
결측 탐지는 반드시 np.isnan()을 씁니다. 자세한 처리는 Python - NumPy 08. 결측치와 이상치 처리.
np.array([1.0, 2.0]) / 0.0 # array([inf, inf]) + RuntimeWarning
np.array([-1.0]) / 0.0 # array([-inf])
np.array([0.0]) / 0.0 # array([nan]) + RuntimeWarning
# 주의: 순수 파이썬 float의 0.0 / 0.0 은 ZeroDivisionError (NumPy 배열만 nan/inf 반환)
np.isinf(x) # inf/-inf 탐지
np.isfinite(x) # nan도 inf도 아닌 정상값만 Truefloat64 → float32는 메모리 절반입니다. 수백만 행 전처리에서 체감됩니다. 정밀도 손실이 허용되는지 판단해서 선택합니다.int32가 부족할 수 있습니다. 의심되면 int64 또는 float64를 씁니다.a > 0)는 bool 배열이고, .sum()을 하면 True의 개수가 나옵니다 (조건을 만족하는 원소 수 세기의 관용 표현입니다).mask = a > 0
mask.sum() # 양수 개수
mask.mean() # 양수 비율💡 이럴 때: 조건을 만족하는 행 수·비율을 빠르게 확인할 때(결측 비율, 이상치 비율, 클래스 양성 비율 점검).
댓글
GitHub 계정으로 의견이나 질문을 남길 수 있습니다.