【问题标题】:Loss of precision when transferring data from hdf5 dataset to numpy array将数据从 hdf5 数据集传输到 numpy 数组时丢失精度
【发布时间】:2016-10-26 16:02:47
【问题描述】:

我正在尝试将数据从 hdf5 数据集(f_one,在下面的屏幕截图中)复制到 numpy 数组中,但我发现我失去了一些精度。

屏幕截图的最后一行(最后一个打印语句)应该是

subid2[0] == subid2[1]

我只是在截屏之前不小心删除了 2。输出是正确的。

如您所见,Python 似乎认为这两个数字完全相同 - 但是,当这两个数字包含在 numpy 数组中时,我需要精确区分它们。 有谁知道我怎样才能得到这个精度?简而言之,我怎样才能让最后一条打印语句产生 False?

顺便说一句:

    f_one['SubhaloID'][0] == f_one['SubhaloID'][1]

产生 错误。因此,在复制到 numpy 数组时会丢失一些精度。

【问题讨论】:

    标签: python numpy precision hdf5


    【解决方案1】:

    问题是您的输入是整数类型,但是当创建一个未指定数据类型的 numpy 数组时,您最终将它们默认转换为浮点数。为避免这种情况,请在为此数据创建 numpy 数组时使用dtype=np.int64。另一种选择是直接转换现有的整数数组,因此继承其条目的类型。

    这是一个简化的例子。

    import numpy as np
    a = [30000000200000000, 30000000200000001]
    print(a[0]==a[1])           # False 
    b = np.array(a)
    print(b[0]==b[1])           # False, direct conversion still has integers 
    c = np.array([])
    for i in range(2):
        c = np.append(c, a[i])
    print(c[0]==c[1])           # True, the entries are now floats
    d = np.array([], dtype=np.int64)
    for i in range(2):
        d = np.append(d, a[i])
    print(d[0]==d[1])           # False, the entries were declared as integers
    

    使用type(c[0])type(d[0]) 检查类型以查看差异。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-29
      • 2020-07-31
      • 2020-10-28
      • 1970-01-01
      • 2011-05-06
      • 1970-01-01
      相关资源
      最近更新 更多