# How to pretty-print a numpy.array without scientific notation and with given precision?

### Question

I'm curious, whether there is any way to print formatted `numpy.arrays`, e.g., in a way similar to this:

``````x = 1.23456
print '%.3f' % x
``````

If I want to print the `numpy.array` of floats, it prints several decimals, often in 'scientific' format, which is rather hard to read even for low-dimensional arrays. However, `numpy.array` apparently has to be printed as a string, i.e., with `%s`. Is there a solution for this?

1
280
2/19/2019 9:02:05 PM

You can use `set_printoptions` to set the precision of the output:

``````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]
``````

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 manager yourself. For example,

``````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]
``````

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]
``````

``````[ 0.078  0.48   0.413  0.83   0.776  0.102  0.513  0.462  0.335  0.712]
``````
467
9/6/2018 3:44:33 PM

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)
>>> 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']
``````

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.25', 'Element=2.28', 'Element=-1.88', 'Element=0.70', 'Element=1.03']
``````