pandas/numpy int64(python 3.6)中意外的 32 位整数溢出

Posted

技术标签:

【中文标题】pandas/numpy int64(python 3.6)中意外的 32 位整数溢出【英文标题】:Unexpected 32-bit integer overflow in pandas/numpy int64 (python 3.6) 【发布时间】:2017-09-17 10:33:37 【问题描述】:

让我从示例代码开始:

import numpy
from pandas import DataFrame

a = DataFrame("nums": [2233, -23160, -43608])

a.nums = numpy.int64(a.nums)

print(a.nums ** 2)
print((a.nums ** 2).sum())

在我的本地机器和其他开发者的机器上,这可以按预期工作并打印出来:

0       4986289
1     536385600
2    1901657664
Name: nums, dtype: int64
2443029553

但是,在我们的生产服务器上,我们得到:

0       4986289
1     536385600
2    1901657664
Name: nums, dtype: int64
-1851937743

这是 32 位整数溢出,尽管它是 int64。

生产服务器使用相同版本的 python、numpy、pandas 等。它是 64-bit Windows Server 2012 操作系统,所有内容都报告 64 位(例如 python --versionsys.maxsizeplastform.architecture)。

这可能是什么原因造成的?

【问题讨论】:

为什么不使用能够表示任意大数字的常规 Python 整数? @ForceBru:如果您尝试使用充满整数对象的对象数组,它们会很慢、很笨重并且会导致奇怪的损坏。 其中一台机器是否安装了bottleneck print((a.nums.values**2).sum(dtype=np.int64)) 的输出是什么? @SeanKramer:我刚刚开始挖掘代码并最终陷入瓶颈。我认为瓶颈是在 C long 为 32 位的平台上对 numpy.int64 处理不当,而 Pandas 在尝试补偿瓶颈错误时检查错误。 【参考方案1】:

这是bottleneck 库中的一个错误,Pandas 会在安装后使用该库。在某些情况下,bottleneck.nansum 在 64 位输入上调用时错误地具有 32 位溢出行为。

我相信这是由于bottleneck using PyInt_FromLong 即使long 是32 位的。实际上,我不确定为什么会编译。 bottleneck issue tracker 上有一个问题报告,尚未修复,以及Pandas issue tracker 上的一个问题报告,他们试图弥补瓶颈的问题(但我认为他们在瓶颈工作时关闭了瓶颈,而不是在它工作时关闭没有)。

【讨论】:

以上是关于pandas/numpy int64(python 3.6)中意外的 32 位整数溢出的主要内容,如果未能解决你的问题,请参考以下文章

从 MySQL 将数值数据加载到 python/pandas/numpy 数组中的最快方法

使用 Pandas 或 NumPy 的 Python 滚动夏普比率

在 python 中使用 pandas,numpy 是不是有 pyspark.ml.feature StringIndexer 的替代方法?

python(pandas模块)?

Python Pandas:“numpy.ndarray”对象没有属性“apply”

numpy pandas1