让我从示例代码开始:
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 位 Windows Server 2012
操作系统,所有内容都报告 64 位(例如 python --版本
, sys.maxsize
, plastform.architecture
).
这可能是什么原因造成的?
最佳答案
这是 bottleneck
库中的一个错误,Pandas 在安装后会使用它。在某些情况下,bottleneck.nansum
在 64 位输入上调用时错误地具有 32 位溢出行为。
我相信这是由于瓶颈
using PyInt_FromLong
即使 long
是 32 位。实际上,我不确定为什么会编译。 bottleneck issue tracker 上有一个问题报告,尚未修复,以及关于 Pandas issue tracker 的问题报告,他们试图弥补 Bottleneck 的问题(但我认为他们在 Bottleneck 正常工作时关闭它,而不是在它不工作时关闭)。
关于python - pandas/numpy int64 中意外的 32 位整数溢出(python 3.6),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43525492/