在给定精度下,美观地打印 NumPy 数组而无需使用科学计数法。

461

我该如何打印格式化的NumPy数组,使其类似于这样:

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

如果我想打印 numpy.ndarray 类型的浮点数,它会输出多个小数位数,通常以“科学”格式呈现,即使对于低维数组也很难阅读。但是,numpy.ndarray 显然必须作为字符串打印,即使用 %s。有没有解决方法?


1
这个讨论也可能会引起那些通过谷歌搜索到这里的人的兴趣。 - Foad S. Farimani
14个回答

2

我使用

def np_print(array,fmt="10.5f"):
    print (array.size*("{:"+fmt+"}")).format(*array)

对于多维数组,修改并不困难。


2

我发现通常的浮点数格式{:9.5f}在使用循环显示列表或数组时可以正常工作 -- 可以抑制小值e-表示法。但是,当格式化程序在一个单独的打印语句中有多个项目时,该格式有时无法抑制其e-表示法。例如:

import numpy as np
np.set_printoptions(suppress=True)
a3 = 4E-3
a4 = 4E-4
a5 = 4E-5
a6 = 4E-6
a7 = 4E-7
a8 = 4E-8
#--first, display separate numbers-----------
print('Case 3:  a3, a4, a5:             {:9.5f}{:9.5f}{:9.5f}'.format(a3,a4,a5))
print('Case 4:  a3, a4, a5, a6:         {:9.5f}{:9.5f}{:9.5f}{:9.5}'.format(a3,a4,a5,a6))
print('Case 5:  a3, a4, a5, a6, a7:     {:9.5f}{:9.5f}{:9.5f}{:9.5}{:9.5f}'.format(a3,a4,a5,a6,a7))
print('Case 6:  a3, a4, a5, a6, a7, a8: {:9.5f}{:9.5f}{:9.5f}{:9.5f}{:9.5}{:9.5f}'.format(a3,a4,a5,a6,a7,a8))
#---second, display a list using a loop----------
myList = [a3,a4,a5,a6,a7,a8]
print('List 6:  a3, a4, a5, a6, a7, a8: ', end='')
for x in myList: 
    print('{:9.5f}'.format(x), end='')
print()
#---third, display a numpy array using a loop------------
myArray = np.array(myList)
print('Array 6: a3, a4, a5, a6, a7, a8: ', end='')
for x in myArray:
    print('{:9.5f}'.format(x), end='')
print()

我的结果显示在第4、5和6个案例中存在错误:

Case 3:  a3, a4, a5:               0.00400  0.00040  0.00004
Case 4:  a3, a4, a5, a6:           0.00400  0.00040  0.00004    4e-06
Case 5:  a3, a4, a5, a6, a7:       0.00400  0.00040  0.00004    4e-06  0.00000
Case 6:  a3, a4, a5, a6, a7, a8:   0.00400  0.00040  0.00004  0.00000    4e-07  0.00000
List 6:  a3, a4, a5, a6, a7, a8:   0.00400  0.00040  0.00004  0.00000  0.00000  0.00000
Array 6: a3, a4, a5, a6, a7, a8:   0.00400  0.00040  0.00004  0.00000  0.00000  0.00000

对于这个问题我没有解释,因此我总是使用循环来输出多个值的浮点数。


1

numpy.char.mod也可能很有用,具体取决于您的应用程序细节,例如:numpy.char.mod('Value=%4.2f', numpy.arange(5, 10, 0.1))将返回一个字符串数组,其中元素为"Value=5.00"、"Value=5.10"等(作为一个有点牵强的例子)。


0
另一个选择是使用decimal模块:
import numpy as np
from decimal import *

arr = np.array([  56.83,  385.3 ,    6.65,  126.63,   85.76,  192.72,  112.81, 10.55])
arr2 = [str(Decimal(i).quantize(Decimal('.01'))) for i in arr]

# ['56.83', '385.30', '6.65', '126.63', '85.76', '192.72', '112.81', '10.55']

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接