np.around和np.round实际上并没有舍入

时间:2015-10-03 00:17:21

标签: arrays python-2.7 numpy rounding

我在Python 2.7中编写了一个简单的代码,将一些非常长的文件更改为文本文件,以便我可以在文本阅读器中滚动它们。

然而,我发现文件中的numpy.array有很长的浮点数,以不必要的科学记数法结束。我尝试使用numpy.aroundnumpy.round将这些更改为仅在小数点后有两个位置,但它不会更改任何内容。这是我的代码:

import h5py
import sys
from Tkinter import Tk
from tkFileDialog import askopenfilename
import numpy as np

sys.stdout.write( 'Please pick file from window\n')
fileName = askopenfilename() # show an "Open" dialog box and return the path to the selected file
sys.stdout.write(fileName)
f = h5py.File(fileName, 'r')
dataset = f['/dcoor'][:]


newname = raw_input('New file name ')
print type(dataset[0][0])
dataset = np.asarray(dataset)
dataset = dataset.astype(float)
print type(dataset[0][0])
print '\nDataset before rounding: \n', dataset
dataset = np.around(dataset, decimals = 2)
print '\nDataset after rounding: \n', dataset
np.savetxt(newname,dataset)

我没有收到任何错误消息,我的输出是这样的:

New file name test4
<type 'numpy.float32'>
<type 'numpy.float64'>

Dataset before rounding: 
[[  1.48999996e+01   1.07949997e+02   1.80000007e-01   3.59000000e+02
    0.00000000e+00]
 [  1.60100002e+01   1.07489998e+02   3.89999986e-01   3.98000000e+02
    0.00000000e+00]
 [  1.86700001e+01   1.07669998e+02   5.89999974e-01   4.26000000e+02
    0.00000000e+00]
 ..., 
 [  2.78700008e+01   2.75200005e+01   2.99973999e+03   4.15000000e+02
    0.00000000e+00]
 [  2.60499992e+01   2.72800007e+01   2.99991992e+03   4.10000000e+02
    0.00000000e+00]
 [  2.56599998e+01   2.85400009e+01   3.00009009e+03   4.37500000e+02
    0.00000000e+00]]

Dataset after rounding: 
[[  1.49000000e+01   1.07950000e+02   1.80000000e-01   3.59000000e+02
    0.00000000e+00]
 [  1.60100000e+01   1.07490000e+02   3.90000000e-01   3.98000000e+02
    0.00000000e+00]
 [  1.86700000e+01   1.07670000e+02   5.90000000e-01   4.26000000e+02
    0.00000000e+00]

这是奇怪的,因为它似乎围绕一些数字而不是其他数字,并且保持尾随zeros。我改变了原来的array,因为我认为这可能有所作为但显然没有。可能问题是array这么久了吗?每个大约有16,000行。是原来的array是否保存在保留原始格式的hdf5文件中?我不能回去重新测试我工作的老鼠,所以如果是这样的话我宁愿SOL。谢谢你的帮助。

1 个答案:

答案 0 :(得分:3)

数字被舍入。它们精确两位小数的原因是因为IEEE 754浮点数具有舍入误差。由于您无法在任何给定的基础(本例中为基数2)中完美地表示所有浮点数(具有有限的大小),因此存在隐式精度问题。

考虑2/35/7等数字。你无法在10号基地完美地代表他们。

但是,我不确定为什么你关心Numpy用repr在视觉上表示花车的方式使用科学记数法。如果你想把它们写出来,可以在数组上使用循环,并在写时指定精度

for row in dataset:
    for elem in row:
        somefile.write("%.2f" % (elem,))

这将确保只写入2个小数位(并且它将按照您尝试的方式对其进行舍入)。但重要的是要注意,当您加载文件时,它仍然会有相同的IEEE 754缺点。