如何设置str(numpy.float64)的精度?

19 投票
5 回答
43347 浏览
提问于 2025-04-16 10:54

我需要把几个numpy的浮点数写入一个包含额外字符串内容的csv文件。所以我不使用savetxt等方法。通过numpy.set_printoptions()我只能定义打印的行为,而不能定义str()的行为。我知道我可能漏掉了什么,这应该不难,但我在网上找不到合适的答案。也许有人可以给我指个方向。以下是一些示例代码:

In [1]: import numpy as np
In [2]: foo = np.array([1.22334])

In [3]: foo
Out[3]: array([ 1.22334])

In [4]: foo[0]
Out[4]: 1.2233400000000001

In [5]: str(foo[0])
Out[5]: '1.22334'

In [6]: np.set_printoptions(precision=3)

In [7]: foo
Out[7]: array([ 1.223])

In [8]: foo[0]
Out[8]: 1.2233400000000001

In [9]: str(foo[0])
Out[9]: '1.22334'

我该如何把np.float转换成格式良好的字符串,以便我可以用file.write()写入文件呢?

祝好,

fookatchu

5 个回答

7

Numpy 1.14及以后的版本提供了两个函数,分别是 format_float_positionalformat_float_scientific,可以把浮点数格式化成小数字符串,支持位置表示法或科学计数法,并且可以控制四舍五入、去掉多余的零和填充。这些函数比普通的Python字符串格式化工具提供了更多的格式控制。

import numpy as np

x = np.float64('1.2345678')
print(np.format_float_positional(x))  # 1.2345678
print(np.format_float_positional(x, precision=3))  # 1.235
print(np.format_float_positional(np.float16(x)))  # 1.234
print(np.format_float_positional(np.float16(x), unique=False, precision=8))  # 1.23437500

y = x / 1e8
print(np.format_float_scientific(y))  # 1.2345678e-08
print(np.format_float_scientific(y, precision=3, exp_digits=1))  # 1.235e-8

等等。


这些高级格式化工具是基于Dragon4算法的;想了解更多,可以看看Ryan Juckett的 打印浮点数

12

你可以使用普通的字符串格式化,具体可以参考这个链接:http://docs.python.org/library/string.html#formatspec

举个例子:

print '{:.2f}'.format(0.1234)  # '0.12'
print '{:.2e}'.format(0.1234)  # '1.23e-01'
18

你可以直接使用标准的字符串格式化方法:

>>> x = 1.2345678
>>> '%.2f' % x
'1.23'

撰写回答