python - 将 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')
谢谢
解决方案
1594686594613248 需要 51 位来表示,所以它适合 64 位数字 (int64),但不适合 32 位数字 (int32)。它溢出:
- 第 32 个剩下的所有位都被截断,即。扔掉,导致完全不同(更小)的值
- 由于整数的内部表示,新的最左边的位(第 32 位)确定数字是正数还是负数,因此您得到的负数结果
只有您确定的强制转换列不包含对于较小类型而言太大的值。大多数情况下,只要您没有数百万个数据点,即使是最小的内存增益也不值得。
推荐阅读
- time-series - Looker - 查找时间序列内所有拐点的第一个日期
- reactjs - 反应钩子:useState,嵌套在 for 循环中的更新器函数不更新状态
- javascript - 在带有输出和输入的角度应用程序待办事项列表中添加待办事项(不起作用)
- sqlalchemy - SQLAlchemy 多对多 - 仅加载 ID
- amazon-web-services - 如何在气流 2.0.1 上禁用默认身份验证
- windows - Windows上的Gvim:以管理员权限打开后文件标记重置
- r - 如何创建雷达图(蜘蛛图)?可以由ggplot2完成吗?
- python - 无法在 colab.search 保存我的 python 代码中的任何更改
- python - 调整观察值的权重以处理逻辑回归中的缺失值
- python - 如何修复 (ModuleNotFoundError: No module named 'sklearn'.) spyder 中的错误