如何设置str(numpy.float64)的精度?
我需要把几个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_positional
和 format_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'