【问题标题】:changing numpy array from type int64 to type int32 corrupts the data将 numpy 数组从 int64 类型更改为 int32 类型会损坏数据
【发布时间】:2020-08-10 21:21:46
【问题描述】:

我在 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')

谢谢

【问题讨论】:

  • 如果您不介意丢失一些精度,可以将时间戳转换为秒/毫秒,以便它们可以用更小的 dtype 表示。

标签: python numpy casting int32


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    值超过int32的限制。

    int32 的限制是整数(-2147483648 到 2147483647)(Refer here.

    【讨论】:

      猜你喜欢
      • 2012-09-20
      • 2023-03-17
      • 1970-01-01
      • 2014-07-31
      • 1970-01-01
      • 1970-01-01
      • 2018-04-23
      • 1970-01-01
      • 2020-12-31
      相关资源
      最近更新 更多