Вопрос-Ответ

Pretty-print a NumPy array without scientific notation and with given precision

Pretty-вывести числовой массив без научных обозначений и с заданной точностью

Как мне распечатать отформатированные массивы NumPy способом, аналогичным этому:

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

Если я хочу напечатать numpy.ndarray число с плавающей точкой, оно выводит несколько десятичных знаков, часто в "научном" формате, который довольно сложно прочитать даже для массивов малой размерности. Однако, numpy.ndarray очевидно, должен быть напечатан в виде строки, т. Е. с %s. Есть ли решение для этого?

Переведено автоматически
Ответ 1

Используйте 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=3 и suppress=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]

Чтобы предотвратить удаление нулей с конца элементов с плавающей точкой:

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]
Ответ 2

Используйте np.array_str для применения форматирования только к одному оператору печати. Это предоставляет подмножество функциональных возможностей np.set_printoptions.

Например:

In [27]: x = np.array([[1.1, 0.9, 1e-6]] * 3)

In [28]: print(x)
[[ 1.10000000e+00 9.00000000e-01 1.00000000e-06]
[ 1.10000000e+00 9.00000000e-01 1.00000000e-06]
[ 1.10000000e+00 9.00000000e-01 1.00000000e-06]]

In [29]: print(np.array_str(x, precision=2))
[[ 1.10e+00 9.00e-01 1.00e-06]
[ 1.10e+00 9.00e-01 1.00e-06]
[ 1.10e+00 9.00e-01 1.00e-06]]

In [30]: print(np.array_str(x, precision=2, suppress_small=True))
[[ 1.1 0.9 0. ]
[ 1.1 0.9 0. ]
[ 1.1 0.9 0. ]]
Ответ 3

Unutbu дал действительно полный ответ (от меня они тоже получили + 1), но вот высокотехнологичная альтернатива:

>>> x=np.random.randn(5)
>>> x
array([ 0.25276524, 2.28334499, -1.88221637, 0.69949927, 1.0285625 ])
>>> ['{:.2f}'.format(i) for i in x]
['0.25', '2.28', '-1.88', '0.70', '1.03']

Как функцию (используя format() синтаксис для форматирования):

def ndprint(a, format_string ='{0:.2f}'):
print [format_string.format(v,i) for i,v in enumerate(a)]

Использование:

>>> ndprint(x)
['0.25', '2.28', '-1.88', '0.70', '1.03']

>>> ndprint(x, '{:10.4e}')
['2.5277e-01', '2.2833e+00', '-1.8822e+00', '6.9950e-01', '1.0286e+00']

>>> ndprint(x, '{:.8g}')
['0.25276524', '2.283345', '-1.8822164', '0.69949927', '1.0285625']

Индекс массива доступен в формате string:

>>> ndprint(x, 'Element[{1:d}]={0:.2f}')
['Element[0]=0.25', 'Element[1]=2.28', 'Element[2]=-1.88', 'Element[3]=0.70', 'Element[4]=1.03']
Ответ 4

К вашему сведению, Numpy 1.15 (дата выпуска в ожидании) будет включать контекстный менеджер для локальной настройки параметров печати. Это означает, что следующее будет работать так же, как соответствующий пример в принятом ответе (unutbu и Neil G) без необходимости писать свой собственный контекстный менеджер. Например, используя их пример:

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]
python numpy