본문 바로가기
Python/Python FAQ

Python 지정된 정밀도로 과학적 표기법 없이 NumPy 배열을 예쁘게 출력합니다., Pretty-print a NumPy array without scientific notation and with given precision

by 베타코드 2023. 11. 14.
반응형

질문


나는 이와 유사한 방식으로 NumPy 배열을 서식화하여 인쇄하는 방법을 알고 싶습니다:

x = 1.23456
print('%.3f' % x)

만약 나는 부동 소수점의 numpy.ndarray를 인쇄하고 싶다면, 여러 소수점이 인쇄되는데, 종종 '과학적' 형식으로 인쇄되어 낮은 차원의 배열에도 읽기 어렵습니다. 그러나 numpy.ndarray는 문자열로 인쇄되어야 한다고 하는 것 같습니다, 즉, %s와 함께입니다. 이에 대한 해결책이 있을까요?


답변


numpy.set_printoptions를 사용하여 출력의 정밀도를 설정합니다:

import numpy as np
x = np.random.random(10)
print(x)
# [ 0.07837821  0.48002108  0.41274116  0.82993414  0.77610352  0.1023732
#   0.51303098  0.4617183   0.33487207  0.71162095]

np.set_printoptions(precision=3)
print(x)
# [ 0.078  0.48   0.413  0.83   0.776  0.102  0.513  0.462  0.335  0.712]

또한 suppress는 작은 수에 대한 과학적 표기법 사용을 억제합니다:

y = np.array([1.5e-10, 1.5, 1500])
print(y)
# [  1.500e-10   1.500e+00   1.500e+03]

np.set_printoptions(suppress=True)
print(y)
# [    0.      1.5  1500. ]

로컬로 출력 옵션을 적용하려면, NumPy 1.15.0 이상을 사용하여 numpy.printoptions 컨텍스트 매니저를 사용할 수 있습니다. 예를 들어, with-suite 내부에서 precision=3suppress=True가 설정됩니다:

x = np.random.random(10)
with np.printoptions(precision=3, suppress=True):
    print(x)
    # [ 0.073  0.461  0.689  0.754  0.624  0.901  0.049  0.582  0.557  0.348]

하지만 with-suite 외부에서는 출력 옵션이 기본 설정으로 돌아갑니다:

print(x)    
# [ 0.07334334  0.46132615  0.68935231  0.75379645  0.62424021  0.90115836
#   0.04879837  0.58207504  0.55694118  0.34768638]

NumPy의 이전 버전을 사용하는 경우, 컨텍스트 매니저를 직접 생성할 수 있습니다. 예를 들어,

import numpy as np
import contextlib

@contextlib.contextmanager
def printoptions(*args, **kwargs):
    original = np.get_printoptions()
    np.set_printoptions(*args, **kwargs)
    try:
        yield
    finally: 
        np.set_printoptions(**original)

x = np.random.random(10)
with printoptions(precision=3, suppress=True):
    print(x)
    # [ 0.073  0.461  0.689  0.754  0.624  0.901  0.049  0.582  0.557  0.348]

소수점 이하의 0이 제거되지 않도록 하려면:

np.set_printoptions에는 이제 각 유형에 대한 형식 함수를 지정할 수 있는 formatter 매개변수가 있습니다.

np.set_printoptions(formatter={'float': '{: 0.3f}'.format})
print(x)

다음을 출력합니다:

[ 0.078  0.480  0.413  0.830  0.776  0.102  0.513  0.462  0.335  0.712]

대신 다음을 출력합니다:

[ 0.078  0.48   0.413  0.83   0.776  0.102  0.513  0.462  0.335  0.712]
반응형

댓글