others - python 在 numpy array 中格式化浮点数

如果我有这样一个numpy数组:


[2.15295647e+01, 8.12531501e+00, 3.97113829e+00, 1.00777250e+01]



如何移动小数点,并且设置数字格式,以便使用如下所示的arraylist数组:


[21.53, 8.13, 3.97, 10.08]



np.around(a, decimals=2)只给我 [2.15300000e+01, 8.13000000e+00, 3.97000000e+00, 1.00800000e+01] 我不想这样,但我也没找到另一种方法。

时间:

为了使arraylist以任意格式显示浮点数组,可以定义一个自定义函数作为输入,并且返回格式化字符串:


In [1]: float_formatter = lambda x: "%.2f" % x



这里的f表示整型格式(不是'科学计数法"'),.2表示两个小数位数(你可以在这里阅读关于字符串格式的更多信息)。

让我们用浮点值测试它:


In [2]: float_formatter(1.234567E3)


Out[2]: '1234.57'



要使numpy以这种方式打印所有浮点数组,你可以将formatter=参数传递给np.set_printoptions


In [3]: np.set_printoptions(formatter={'float_kind':float_formatter})



现在numpy将以这种方式打印所有浮点数组:


In [4]: np.random.randn(5) * 10


Out[4]: array([5.25, 3.91, 0.04, -1.53, 6.68]



注意,这只影响numpy数组,而不影响标量:


In [5]: np.pi


Out[5]: 3.141592653589793



它也不会影响非浮点数,复杂的浮点数等 - 你需要为其他标量类型定义单独的格式化程序。

你还应该注意,这只影响numpy显示浮点值的方式-在计算中使用的实际值将保留它原始精度。

例如:


In [6]: a = np.array([1E-9])



In [7]: a


Out[7]: array([0.00])



In [8]: a == 0


Out[8]: array([False], dtype=bool)



numpy像0一样打印a,但是,它仍然等于1E-9 。

如果你实际上想以影响计算方式的方式对数组中的值进行循环,应该使用np.round

你使实际精度和显示精度变得混乱,十进制舍入不能在二进制中精确表示,你应该尝试:


> np.set_printoptions(precision=2)


> np.array([5.333333])


array([ 5.33])



你可以使用round函数。 这里有些例子


numpy.round([2.15295647e+01, 8.12531501e+00, 3.97113829e+00, 1.00777250e+01],2)


array([ 21.53, 8.13, 3.97, 10.08])



如果你希望更改只显示表示形式,我不建议全局改变打印格式,如上所示,我把我的输出格式化了。


>>a=np.array([2.15295647e+01, 8.12531501e+00, 3.97113829e+00, 1.00777250e+01])


>>> print [ "{:0.2f}".format(x) for x in a ]


['21.53', '8.13', '3.97', '10.08']



...