【问题标题】:np.around and np.round not actually roundingnp.around 和 np.round 实际上不是四舍五入
【发布时间】:2015-12-31 06:42:58
【问题描述】:

我正在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。感谢您的帮助。

【问题讨论】:

    标签: arrays python-2.7 numpy rounding


    【解决方案1】:

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

    想想2/35/7 这样的数字。您无法以 10 为基数完美地表示它们。

    但是,我不知道你为什么关心 Numpy 在视觉上用repr 表示浮点数的方式使用科学记数法这一事实。当你想写出它们时,你可以在数组上使用循环并指定精度写时

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

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

    【讨论】:

      猜你喜欢
      • 2020-12-27
      • 1970-01-01
      • 2011-08-30
      • 2017-11-26
      • 1970-01-01
      • 2023-01-12
      • 1970-01-01
      • 1970-01-01
      • 2012-08-04
      相关资源
      最近更新 更多