Search code examples
pythonnumpypretty-print

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


How do I print formatted NumPy arrays in a way similar to this:

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

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


Solution

  • Use numpy.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. ]
    

    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]
    

    instead of

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