NumPy 2.4 완벽 가이드: 프리 스레딩, StringDType, 성능 최적화

NumPy 2.4의 핵심 변경사항을 실전 코드와 함께 정리합니다. 프리 스레딩 Python 공식 지원, 해시 기반 unique 15배 속도 향상, ndmax 파라미터, same_value 캐스팅 등 2.0부터 2.4까지의 마이그레이션 가이드를 다룹니다.

서론: NumPy 2.x — 16년 만의 대전환

pandas 3.0, Polars, scikit-learn 1.8까지 살펴봤으니, 이제 이 모든 라이브러리의 기반이 되는 NumPy를 짚어볼 차례입니다. NumPy는 Python 데이터 과학 생태계의 말 그대로 '기반 암반'이죠. 2024년 6월에 나온 NumPy 2.0이 2006년 이후 무려 18년 만의 메이저 업데이트였는데, 그게 벌써 거의 2년 전 일입니다.

그리고 2025년 12월, NumPy 2.4.0이 릴리스되면서 프리 스레딩 Python 지원, StringDType 완성, 상당한 성능 개선까지 한꺼번에 이루어졌습니다.

솔직히 말하면, NumPy 2.0의 브레이킹 체인지 때문에 마이그레이션을 계속 미뤄왔던 분들 꽤 있을 거예요. 저도 그중 하나였습니다. 하지만 2.4까지 오면서 생태계가 충분히 안정화됐고, 지금이 업그레이드하기 딱 좋은 시점이에요. 이 가이드에서는 NumPy 2.0부터 2.4까지의 핵심 변화를 빠짐없이 정리하고, 실전 코드와 함께 마이그레이션 전략까지 다루겠습니다.

NumPy 2.0: 18년 만의 메이저 업데이트 핵심 요약

NumPy 2.4를 제대로 이해하려면, 먼저 2.0에서 뭐가 바뀌었는지부터 알아야 합니다. NumPy 2.0.0은 212명의 기여자가 1,078개의 PR을 통해 만든 대규모 릴리스였어요. 숫자만 봐도 규모가 느껴지죠.

API 대청소: 약 100개 함수 이동·제거

NumPy 2.0에서는 메인 np 네임스페이스에서 약 100개의 멤버가 제거되거나 다른 곳으로 이동했습니다. 불필요하거나 오래된 기능을 정리하고, 하나의 기능에 하나의 접근 방법만 남기기 위한 작업이었는데요 — 솔직히 처음엔 좀 당황스러웠습니다.

# NumPy 1.x (더 이상 작동하지 않음)
import numpy as np
np.bool       # 제거됨 → Python 내장 bool 사용
np.int        # 제거됨 → Python 내장 int 사용
np.float      # 제거됨 → Python 내장 float 사용
np.complex    # 제거됨 → Python 내장 complex 사용
np.object     # 제거됨 → Python 내장 object 사용
np.str        # 제거됨 → Python 내장 str 사용

# NumPy 2.x에서의 올바른 사용법
np.bool_      # NumPy 불리언 타입
np.int64      # 명시적 정수 타입
np.float64    # 명시적 부동소수점 타입

기본 정수 타입 변경

NumPy의 기본 정수 타입이 모든 64비트 시스템에서 64비트로 통일되었습니다. 이전에는 Windows에서 32비트였던 것이 이제 Linux, macOS와 동일하게 int64가 됩니다.

크로스 플랫폼 일관성 측면에서 큰 개선이지만, 메모리 사용량이 달라질 수 있으니 주의하세요. 특히 대용량 데이터를 다루는 경우 이 변화가 체감될 수 있습니다.

스칼라 타입 프로모션 규칙 변경 (NEP 50)

이건 꽤 중요한 변화입니다. 이전에는 스칼라와 배열의 연산 시 스칼라의 에 따라 결과 타입이 달라지는, 예측하기 어려운 동작이 있었거든요. NumPy 2.0부터는 타입만 보고 프로모션을 결정하므로 훨씬 직관적입니다.

import numpy as np

# NumPy 1.x에서는 값에 따라 결과가 달라졌음
arr = np.array([1, 2, 3], dtype=np.int8)
result = arr + 127   # int8 범위 내 → int8 유지
result2 = arr + 128  # int8 범위 초과 → int16으로 프로모션 (!)

# NumPy 2.x에서는 일관된 동작
result = arr + 127   # int8 유지
result2 = arr + 128  # 여전히 int8 (오버플로우 발생 가능)

다만 이 변경 때문에 기존 코드에서 오버플로우가 발생할 수 있으니, 업그레이드 후 수치 계산 결과를 꼭 검증해 보시길 바랍니다.

바이너리 호환성 단절

NumPy 2.0은 ABI(Application Binary Interface)가 변경되어, NumPy 1.x용으로 빌드된 C 확장 패키지들이 NumPy 2.0에서 작동하지 않습니다. 걱정이 될 수 있는데, 다행히 대부분의 주요 라이브러리들은 이미 NumPy 2.0 호환 빌드를 제공하고 있어서 pip install --upgrade로 해결됩니다.

NumPy 2.1~2.2: 안정화와 새 기능 도입

NumPy 2.1 핵심 변경사항

NumPy 2.1은 2.0의 급격한 변화 이후 정상적인 릴리스 주기로 복귀하는 첫 번째 릴리스였습니다. 큰 브레이킹 체인지 없이 유용한 기능들이 추가됐어요.

  • Python 3.13 지원 및 프리 스레딩(free-threaded) CPython 예비 지원
  • np.unstack() 함수 추가 — np.stack()의 역연산으로, 있으면 편한 함수
  • np.cumulative_sum()np.cumulative_prod() — Array API 호환 누적 합/곱
  • np.clip()min, max 키워드 인수 추가
import numpy as np

# np.unstack — 배열을 축을 따라 분할
arr = np.array([[1, 2], [3, 4], [5, 6]])
result = np.unstack(arr, axis=0)
# (array([1, 2]), array([3, 4]), array([5, 6]))

# np.cumulative_sum — 초기값 포함 가능
data = np.array([1, 2, 3, 4])
cumsum = np.cumulative_sum(data, include_initial=True)
# array([0, 1, 3, 6, 10])

NumPy 2.2 핵심 변경사항

NumPy 2.2는 StringDType 완성과 프리 스레딩 지원 개선에 초점을 맞췄습니다. 개인적으로 matvecvecmat 추가가 반가웠는데, 매번 @ 연산자에서 차원을 맞추느라 고생했거든요.

  • np.matvec()np.vecmat() — 행렬-벡터, 벡터-행렬 곱 전용 함수
  • 대형 배열 repr에 shape 정보 자동 포함
  • Linux에서 대용량 np.zeros 할당 시 hugepages 활용으로 성능 향상
  • Python 3.12 이상에서 프로토콜 속성 조회 최적화로 함수 호출 오버헤드 감소
import numpy as np

# np.matvec — 행렬과 벡터의 곱
matrix = np.array([[1, 2], [3, 4]])
vector = np.array([5, 6])
result = np.matvec(matrix, vector)
# array([17, 39])

# 대형 배열의 새로운 repr
large_arr = np.zeros((100, 200, 300))
print(repr(large_arr))
# array([[[0., 0., 0., ..., 0., 0., 0.],
#         ...
#         [0., 0., 0., ..., 0., 0., 0.]]], shape=(100, 200, 300))

NumPy 2.4: 최신 핵심 기능 완전 분석

자, 이제 본론입니다. 2025년 12월에 릴리스된 NumPy 2.4.0은 Python 3.11~3.14를 지원하며, 프리 스레딩 Python 지원 강화, 사용자 정의 dtype 구현 개선, 그리고 주목할 만한 성능 최적화가 포함되어 있습니다.

StringDType 완전체: 해시 기반 unique와 결측값 처리

np.unique()가 문자열 dtype에 대해 해시 기반 중복 제거를 지원하게 됐는데, 성능 차이가 정말 극적입니다. 바이트 문자열('S'), 유니코드 문자열('U'), 그리고 실험적 StringDType('T') 모두에서 작동합니다.

import numpy as np

# 해시 기반 np.unique — 문자열에서 극적인 성능 향상
names = np.array(["김철수", "이영희", "김철수", "박민수", "이영희"] * 100000)
unique_names = np.unique(names)
# 해시 기반으로 동작 — 정렬 기반 대비 최대 15배 빠름
# 주의: 반환 순서가 정렬되지 않을 수 있음

# StringDType에서 결측값 처리
from numpy.dtypes import StringDType
arr = np.array(["hello", None, "world"], dtype=StringDType(na_object=None))
unique_vals = np.unique(arr, equal_nan=True)
# None을 하나의 고유값으로 처리

ndmax: 중첩 시퀀스의 차원 제어

np.array()ndmax 파라미터가 새로 추가됐습니다. 중첩 시퀀스에서 생성할 최대 차원 수를 명시적으로 제한할 수 있어요. dtype=object와 함께 사용할 때 특히 유용한데, 가변 길이 시퀀스를 다뤄본 분이라면 이 기능이 얼마나 반가운지 아실 겁니다.

import numpy as np

data = [[1, 2], [3, 4]]

# 기본 동작: 최대한 깊이 재귀하여 2D 배열 생성
arr_default = np.array(data, dtype=object)
print(arr_default.shape)  # (2, 2)

# ndmax=1: 리스트를 원소로 유지하며 1D 배열 생성
arr_1d = np.array(data, dtype=object, ndmax=1)
print(arr_1d.shape)   # (2,)
print(arr_1d[0])      # [1, 2] — 파이썬 리스트 그대로 보존

# 실전 활용: 가변 길이 시퀀스를 배열로 저장
sequences = [[1, 2, 3], [4, 5], [6]]
arr = np.array(sequences, dtype=object, ndmax=1)
# shape: (3,) — 각 원소가 서로 다른 길이의 리스트

same_value 캐스팅: 안전한 타입 변환

새로운 casting='same_value' 옵션은 정말 실용적인 기능이에요. 값이 변경되는 캐스팅에서 에러가 발생하도록 해서, 반올림이나 오버플로우로 인한 데이터 손실을 사전에 방지할 수 있습니다.

import numpy as np

# same_value 캐스팅 — 값이 변하면 에러 발생
float_arr = np.array([1.0, 2.0, 3.0])
int_arr = float_arr.astype(np.int64, casting='same_value')
# 성공: 값이 정확히 보존됨

float_arr2 = np.array([1.5, 2.7, 3.1])
try:
    int_arr2 = float_arr2.astype(np.int64, casting='same_value')
except ValueError as e:
    print(f"캐스팅 실패: {e}")
    # ValueError: 값이 변경되므로 캐스팅 불가

__numpy_dtype__ 프로토콜

사용자 정의 클래스에서 __numpy_dtype__ 메서드를 구현하면, np.dtype()에 직접 전달할 수 있게 됐습니다. 서드파티 라이브러리 개발자라면 관심을 가질 만한 기능이죠.

import numpy as np

class MyCustomType:
    """사용자 정의 dtype 프로토콜 예제"""
    def __numpy_dtype__(self):
        return np.dtype('float32')

# 사용자 정의 객체를 np.dtype()에 바로 전달
dt = np.dtype(MyCustomType())
print(dt)  # float32

arr = np.array([1, 2, 3], dtype=MyCustomType())
print(arr.dtype)  # float32

프리 스레딩 Python: GIL 없는 NumPy의 시대

프리 스레딩(free-threaded) Python은 NumPy 2.x 시리즈 전체를 관통하는 핵심 테마입니다. 기존 Python의 GIL(Global Interpreter Lock) 때문에 멀티 스레딩의 효과가 제한되었던 것을, 드디어 근본적으로 해결하는 방향으로 나아가고 있어요.

발전 과정

프리 스레딩 지원이 점진적으로 강화되어 온 과정을 보면 NumPy 팀의 신중함이 느껴집니다.

  • NumPy 2.1 (2024년 8월): CPython 3.13 프리 스레딩 빌드 예비 지원
  • NumPy 2.2 (2024년 12월): 프리 스레딩 지원 개선, C 스레드 안전성 문제 수정
  • NumPy 2.4 (2025년 12월): Python 3.14 공식 지원, 프리 스레딩이 '실험적'에서 '공식 지원'으로 전환

실전 성능 비교

프리 스레딩 Python에서는 스레드 기반 병렬 처리로 50%~90%의 처리 시간 단축이 가능합니다. 상당히 인상적인 수치죠. 다만 싱글 스레드 성능은 약 5~10% 정도 느려질 수 있어서, 워크로드 특성에 따라 판단해야 합니다.

import numpy as np
from concurrent.futures import ThreadPoolExecutor
import time

def heavy_computation(arr):
    """CPU 집약적 연산 시뮬레이션"""
    result = np.fft.fft(arr)
    result = np.sort(result.real)
    return np.sum(result)

# 대량의 배열 데이터 생성
arrays = [np.random.randn(1_000_000) for _ in range(8)]

# 순차 실행
start = time.perf_counter()
sequential_results = [heavy_computation(arr) for arr in arrays]
sequential_time = time.perf_counter() - start

# 병렬 실행 (프리 스레딩 Python 3.14t에서)
start = time.perf_counter()
with ThreadPoolExecutor(max_workers=4) as executor:
    parallel_results = list(executor.map(heavy_computation, arrays))
parallel_time = time.perf_counter() - start

print(f"순차 실행: {sequential_time:.2f}초")
print(f"병렬 실행: {parallel_time:.2f}초")
print(f"속도 향상: {sequential_time / parallel_time:.1f}배")
# 프리 스레딩 Python에서 2~4배 속도 향상 기대

스레드 안전성 주의사항

여기서 한 가지 꼭 짚고 넘어가야 할 부분이 있습니다. 프리 스레딩 환경에서 NumPy 배열을 여러 스레드에서 공유할 때는 주의가 필요해요. 읽기는 안전하지만, 여러 스레드에서 동시에 같은 배열에 쓰기 작업을 하면 레이스 컨디션이 발생합니다.

import numpy as np
from threading import Thread

shared_array = np.zeros(1000)

# 위험: 여러 스레드에서 동시에 같은 배열을 수정
def unsafe_write(arr, start, end):
    for i in range(start, end):
        arr[i] += 1  # 레이스 컨디션 발생 가능!

# 안전: 각 스레드가 서로 다른 영역을 수정
def safe_write(arr, start, end):
    arr[start:end] += 1  # 비겹치는 슬라이스 → 안전

# 또는: 각 스레드에서 별도 배열을 생성한 후 합치기
def safest_approach(data):
    local_result = np.zeros(1000)
    local_result[:len(data)] = data
    return local_result

참고로, NumPy 2.4에서는 ndarray.strides 속성 설정이 deprecated됐는데, 이것도 멀티 스레딩 환경에서의 안전성을 위한 조치입니다.

NumPy 2.4 성능 벤치마크

성능 이야기를 좀 더 해보겠습니다. NumPy 2.4는 여러 영역에서 꽤 인상적인 개선을 보여줍니다.

스칼라 ufunc 연산: 최대 6배 향상

단항 ufunc의 스칼라 연산 속도가 약 6배 빨라졌습니다. 이전에는 표준 math 모듈 대비 19배 느렸던 것이 이제 약 3배 수준으로 좁혀졌어요. 여전히 math 모듈보다 느리긴 하지만, 격차가 확 줄었습니다.

import numpy as np
import math
import timeit

x = 1.5

# NumPy 2.3 이전: math.sin 대비 ~19배 느림
# NumPy 2.4:      math.sin 대비 ~3배 느림 (6배 개선)
numpy_time = timeit.timeit(lambda: np.sin(x), number=100000)
math_time = timeit.timeit(lambda: math.sin(x), number=100000)
print(f"np.sin: {numpy_time:.3f}s, math.sin: {math_time:.3f}s")

문자열 unique: 최대 15배 향상

해시 기반 알고리즘 덕분에 np.unique()의 문자열 처리 속도가 극적으로 빨라졌습니다. 약 10억 개 요소 기준으로 기존 498초에서 33.5초로, 약 15배 빨라진 거예요. 대용량 텍스트 데이터를 다루는 분들에게는 정말 큰 차이입니다.

ndindex: 5.2배 향상

np.ndindex가 내부적으로 itertools.product를 사용하도록 변경되어, (50, 60, 90) shape 기준으로 약 5.2배 빨라졌습니다.

complex dtype unique: 1.4~5배 향상

np.unique()의 해시 기반 알고리즘이 complex dtype으로도 확장되었습니다. 고유값 비율에 따라 1.4배에서 5배까지 성능이 향상됩니다.

NumPy 1.x에서 2.4로 마이그레이션하기

마이그레이션이 복잡해 보일 수 있지만, 체계적으로 접근하면 대부분의 코드는 생각보다 쉽게 전환됩니다. 단계별로 살펴보죠.

1단계: Ruff를 이용한 자동 검사

먼저 Ruff부터 돌려보세요. NumPy 팀이 Ruff 린터에 전용 규칙(NPY201)을 제공하거든요. 코드에서 변경이 필요한 부분을 자동으로 찾아줍니다.

# ruff를 이용한 NumPy 2.0 호환성 검사
pip install ruff
ruff check --select NPY201 your_project/

2단계: 주요 변경사항 수정

Ruff가 찾아준 항목들을 하나씩 수정합니다. 대부분 이름 바꾸기 수준이라 어렵지 않아요.

# 1. 제거된 타입 별칭 교체
# Before
np.bool → bool 또는 np.bool_
np.int → int 또는 np.int_
np.float → float 또는 np.float64
np.complex → complex 또는 np.complex128
np.object → object
np.str → str 또는 np.str_

# 2. 제거된 함수 교체
np.in1d(a, b) → np.isin(a, b)
np.trapz(y, x) → np.trapezoid(y, x)
np.AxisError → np.exceptions.AxisError
np.row_stack → np.vstack

# 3. np.core 접근 금지
np.core.something → np.something  # 메인 네임스페이스에서 직접 접근

# 4. 정수 타입 크기 변경 대응
# Windows에서 기본 int가 int32 → int64로 변경됨
# 필요하다면 명시적으로 dtype을 지정
arr = np.array([1, 2, 3], dtype=np.int32)  # 이전 동작이 필요한 경우

3단계: 의존 패키지 업데이트

NumPy만 올리면 안 됩니다. 의존 패키지들도 같이 업데이트해 주세요.

# 모든 NumPy 의존 패키지를 최신 버전으로 업데이트
pip install --upgrade pandas scipy scikit-learn matplotlib

# 호환성 확인
python -c "import numpy; print(numpy.__version__)"
python -c "import pandas; print(pandas.__version__)"
python -c "import scipy; print(scipy.__version__)"

4단계: NumPy 2.4 제거된 기능 점검

NumPy 2.4에서는 이전 버전에서 deprecated 경고만 내던 기능들이 완전히 제거됐습니다. 한번 쭉 확인해 보세요.

# NumPy 2.4에서 제거된 주요 기능들
np.in1d         → np.isin
np.trapz        → np.trapezoid
np.linalg.linalg → np.linalg
np.fft.helper   → np.fft

# reshape에서 newshape= 키워드 제거
np.reshape(arr, newshape=(2, 3))  # 에러
np.reshape(arr, (2, 3))           # 위치 인수로 전달
np.reshape(arr, shape=(2, 3))     # 또는 shape= 키워드 사용

# ndim > 0 배열의 스칼라 변환 제거
arr = np.array([42])
int(arr)    # 여전히 작동
float(arr)  # 여전히 작동
# 하지만 bool(np.array([])) → TypeError 발생

NumPy 2.4와 데이터 과학 생태계 통합

NumPy 2.4가 Python 데이터 과학 스택의 다른 라이브러리들과 어떻게 연동되는지도 살펴봐야겠죠.

Pandas 3.0과 NumPy 2.4

Pandas 3.0은 NumPy 2.x를 완전히 지원하며, PyArrow 백엔드와 NumPy 백엔드를 모두 활용합니다. NumPy 2.4의 StringDType 개선은 Pandas의 문자열 처리에도 간접적으로 영향을 미치고요.

import pandas as pd
import numpy as np

# Pandas DataFrame에서 NumPy 배열로의 변환
df = pd.DataFrame({
    "이름": ["김철수", "이영희", "박민수"],
    "점수": [95, 87, 92]
})

# NumPy 2.4에서 점수 열 추출 및 연산
scores = df["점수"].to_numpy()
print(scores.dtype)  # int64 (NumPy 2.x 기본)

# 정규화 (NumPy 벡터 연산)
normalized = (scores - scores.mean()) / scores.std()
print(normalized)

scikit-learn 1.8과 NumPy 2.4

scikit-learn 1.8은 NumPy 2.x의 Array API를 활용해서 GPU 가속을 지원합니다. NumPy 2.4의 프리 스레딩 지원은 scikit-learn의 병렬 학습 성능 향상에도 기여하고요.

import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split

# NumPy 배열로 데이터 생성
X = np.random.randn(10000, 20).astype(np.float32)
y = (X[:, 0] + X[:, 1] > 0).astype(np.int64)

# 학습/테스트 분할
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42
)

# 표준화 (NumPy 2.4의 float32 정밀도 향상의 혜택)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

실전 활용 팁

마지막으로, NumPy 2.4에서 새로 추가되거나 개선된 실전에서 바로 쓸 수 있는 기능들을 정리합니다.

np.pad의 딕셔너리 pad_width

이건 소소하지만 편리한 변화입니다. np.pad()가 딕셔너리 형태의 pad_width를 지원해서, 축별로 다른 패딩을 더 직관적으로 지정할 수 있게 됐어요.

import numpy as np

arr = np.array([[1, 2], [3, 4]])

# 딕셔너리로 축별 패딩 지정
padded = np.pad(arr, pad_width={0: 1, 1: 2}, mode='constant')
# 0축(행)은 위아래 1씩, 1축(열)은 좌우 2씩 패딩
print(padded)
# [[0, 0, 0, 0, 0, 0],
#  [0, 0, 1, 2, 0, 0],
#  [0, 0, 3, 4, 0, 0],
#  [0, 0, 0, 0, 0, 0]]

np.size의 다중 축 지원

import numpy as np

arr = np.zeros((3, 4, 5))

# 여러 축의 크기를 한번에 확인
total = np.size(arr, axis=(0, 1))  # 3 * 4 = 12
print(total)  # 12

quantile/percentile의 정밀도 개선

16비트, 32비트 부동소수점 입력에 대한 np.quantile()np.percentile()의 정확도가 향상됐습니다. 메모리 효율을 위해 float16이나 float32를 쓰는 대규모 데이터셋에서 특히 유용합니다.

import numpy as np

# float16 데이터에서 더 정확한 분위수 계산
data_f16 = np.random.randn(100000).astype(np.float16)
q25, q50, q75 = np.quantile(data_f16, [0.25, 0.5, 0.75])
print(f"Q25: {q25:.4f}, 중앙값: {q50:.4f}, Q75: {q75:.4f}")
# NumPy 2.4에서 float16 입력의 분위수 정확도 향상

자주 묻는 질문 (FAQ)

NumPy 2.x는 NumPy 1.x 코드와 호환되나요?

완전한 하위 호환은 아닙니다. NumPy 2.0에서 약 100개의 API가 제거·이동되었고, 타입 프로모션 규칙도 변경됐어요. 하지만 Ruff의 NPY201 규칙을 사용하면 변경이 필요한 부분을 자동으로 찾을 수 있고, 대부분의 수정은 간단한 이름 변경 수준입니다. NumPy 2.4에서는 2.0~2.2에서 deprecated된 기능들이 완전히 제거되었으니, 가급적 빨리 업그레이드하는 것을 권장합니다.

프리 스레딩 Python에서 NumPy를 사용하려면 어떻게 설정하나요?

생각보다 간단합니다. Python 3.13t 또는 3.14t(프리 스레딩 빌드)를 설치한 후, 일반적인 방식으로 NumPy 2.4를 설치하면 돼요. 별도의 NumPy 설정은 필요 없고, Python 자체가 GIL 없이 실행됩니다. python3.14t -m pip install numpy처럼 프리 스레딩 빌드의 인터프리터를 사용하면 됩니다. 다만 싱글 스레드 성능이 5~10% 정도 느려질 수 있으니, 실제로 멀티 스레딩이 필요한 워크로드에서만 사용하는 게 좋습니다.

NumPy 배열과 Python 리스트의 속도 차이는 얼마나 되나요?

일반적으로 NumPy 배열은 Python 리스트 대비 수치 연산에서 10~100배 빠릅니다. NumPy 배열은 동일한 타입의 데이터가 연속된 메모리 공간에 저장되고, C로 최적화된 연산을 수행하기 때문이에요. NumPy 2.4에서는 스칼라 ufunc 연산이 추가로 6배 빨라져서, 단일 값 연산에서도 성능 차이가 줄었습니다.

NumPy 2.4에서 더 이상 사용할 수 없는 함수는 무엇인가요?

주요 제거 항목으로는 np.in1d(→ np.isin), np.trapz(→ np.trapezoid), np.linalg.linalg(→ np.linalg), np.fft.helper(→ np.fft), reshapenewshape= 키워드, quantileinterpolation= 키워드 등이 있습니다. 전체 목록은 공식 릴리스 노트에서 확인하세요.

NumPy vs Polars, 언제 뭘 써야 하나요?

이 질문 정말 많이 받는데요, 용도가 다릅니다. NumPy는 수치 배열 연산(행렬 곱셈, FFT, 선형 대수, 신호 처리 등)에 최적화된 라이브러리이고, Polars는 테이블 형태 데이터의 조작과 분석(필터링, 그룹화, 조인, 집계 등)에 특화되어 있어요. 과학 계산이나 머신러닝 알고리즘 구현에는 NumPy를, 데이터 전처리와 분석에는 Polars나 Pandas를 사용하세요. 실무에서는 두 라이브러리를 함께 사용하는 경우가 대부분입니다.

저자 소개 Editorial Team

Our team of expert writers and editors.