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

标签 python python-3.x pandas numpy integer-overflow

让我从示例代码开始:

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/

相关文章:

python - 如何计算第一个非纳米值以来的值?

Python Pandas - 将某些列类型更改为类别

python - urllib3 如何确定使用哪些 TLS 扩展?

php - 如何让 PHP 终止 www-data 进程?

Python 循环缺少结果

python - 在 pandas 中,根据顺序和值创建一个新列

python - 索引 Pandas 数据框时出现 KeyError

Python:如何检查字符串是否包含列表中的元素并取出该元素?

python - 类型错误 : Unicode-objects must be encoded before hashing in Hashlib Function

pandas - 如何在数据框(广播)中添加多个列?