首页 > 解决方案 > 将 numpy 数组从 int64 类型更改为 int32 类型会损坏数据

问题描述

我在 pandas 中使用了一个非常大的数据集,为了减少对内存的使用,我将所有列从 float64 转换为 float32,从 int64 转换为 int32。其中一列是以纳秒为单位的时间戳(类似于 1594686594613248)。在铸造之前,它只有正值。铸造后,它大多具有负值。astype('int32') 有什么错误吗?我在这里想念什么。

相关代码:

data_uid_label = pd.read_csv('label_to_uid.csv')
types = data_uid_label.dtypes
for name in data_uid_label.columns:
    if(types[name]=='float64'):
        data_uid_label[name]=data_uid_label[name].astype('float32')
    if(types[name]=='int64'):
        data_uid_label[name]=data_uid_label[name].astype('int32')

谢谢

标签: pythonnumpycastingint32

解决方案


1594686594613248 需要 51 位来表示,所以它适合 64 位数字 (int64),但不适合 32 位数字 (int32)。它溢出:

  • 第 32 个剩下的所有位都被截断,即。扔掉,导致完全不同(更小)的值
  • 由于整数的内部表示,新的最左边的位(第 32 位)确定数字是正数还是负数,因此您得到的负数结果

只有您确定的强制转换列不包含对于较小类型而言太大的值。大多数情况下,只要您没有数百万个数据点,即使是最小的内存增益也不值得。


推荐阅读