How to pretty-print a numpy.array without scientific notation and with given precision?
You can use set_printoptions
to set the precision of the output:
import numpy as npx=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]
And suppress
suppresses the use of scientific notation for small numbers:
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. ]
See the docs for set_printoptions for other options.
To apply print options locally, using NumPy 1.15.0 or later, you could use the numpy.printoptions context manager. For example, inside the with-suite
precision=3
and suppress=True
are set:
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]
But outside the with-suite
the print options are back to default settings:
print(x) # [ 0.07334334 0.46132615 0.68935231 0.75379645 0.62424021 0.90115836# 0.04879837 0.58207504 0.55694118 0.34768638]
If you are using an earlier version of NumPy, you can create the context manageryourself. For example,
import numpy as npimport contextlib@contextlib.contextmanagerdef 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]
To prevent zeros from being stripped from the end of floats:
np.set_printoptions
now has a formatter
parameter which allows you to specify a format function for each type.
np.set_printoptions(formatter={'float': '{: 0.3f}'.format})print(x)
which prints
[ 0.078 0.480 0.413 0.830 0.776 0.102 0.513 0.462 0.335 0.712]
instead of
[ 0.078 0.48 0.413 0.83 0.776 0.102 0.513 0.462 0.335 0.712]
You can get a subset of the np.set_printoptions
functionality from the np.array_str
command, which applies only to a single print statement.
http://docs.scipy.org/doc/numpy/reference/generated/numpy.array_str.html
For example:
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. ]]
Unutbu gave a really complete answer (they got a +1 from me too), but here is a lo-tech alternative:
>>> x=np.random.randn(5)>>> xarray([ 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']
As a function (using the format()
syntax for formatting):
def ndprint(a, format_string ='{0:.2f}'): print [format_string.format(v,i) for i,v in enumerate(a)]
Usage:
>>> 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']
The index of the array is accessible in the format 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']