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 --version
、sys.maxsize
、plastform.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 的替代方法?