将数据从 hdf5 数据集传输到 numpy 数组时精度损失
Loss of precision when transferring data from hdf5 dataset to numpy array
我正在尝试将数据从 hdf5 数据集(f_one,在下面的屏幕截图中)复制到一个 numpy 数组中,但我发现我失去了一些精度。
屏幕截图的最后一行(最后一条打印语句)应显示为
subid2[0] == subid
2[1]
。
我只是在截图之前不小心删除了2。输出是正确的。
如您所见,Python 似乎认为这两个数字完全相同 - 但是,当它们包含在 numpy 数组中时,我需要精确区分这两个数字。 有谁知道我怎样才能得到这个精度?简而言之,我怎样才能让最后的 print 语句产生 False?
顺便说一句:
f_one['SubhaloID'][0] == f_one['SubhaloID'][1]
产生 错误 。所以在复制到 numpy 数组时会丢失一些精度。
问题是您的输入是整数类型,但是当创建一个 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])
检查类型以查看差异。
我正在尝试将数据从 hdf5 数据集(f_one,在下面的屏幕截图中)复制到一个 numpy 数组中,但我发现我失去了一些精度。
屏幕截图的最后一行(最后一条打印语句)应显示为
subid2[0] == subid
2[1]
。
我只是在截图之前不小心删除了2。输出是正确的。
如您所见,Python 似乎认为这两个数字完全相同 - 但是,当它们包含在 numpy 数组中时,我需要精确区分这两个数字。 有谁知道我怎样才能得到这个精度?简而言之,我怎样才能让最后的 print 语句产生 False?
顺便说一句:
f_one['SubhaloID'][0] == f_one['SubhaloID'][1]
产生 错误 。所以在复制到 numpy 数组时会丢失一些精度。
问题是您的输入是整数类型,但是当创建一个 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])
检查类型以查看差异。