python - numpy.sum() 在大数组上给出奇怪的结果

标签 python python-2.7 numpy

我似乎发现了在 numpy 数组上使用 .sum() 的陷阱,但我找不到解释。本质上,如果我尝试对一个大数组求和,然后我开始得到荒谬的答案,但这种情况发生悄无声息,我无法很好地理解输出结果以谷歌搜索原因。

例如,这完全符合预期:

a = sum(xrange(2000)) 
print('a is {}'.format(a))

b = np.arange(2000).sum()
print('b is {}'.format(b))

为两者提供相同的输出:

a is 1999000
b is 1999000

但是,这不起作用:

c = sum(xrange(200000)) 
print('c is {}'.format(c))

d = np.arange(200000).sum()
print('d is {}'.format(d))

给出以下输出:

c is 19999900000
d is -1474936480

并且在更大的阵列上,有可能得到肯定的结果。这更加阴险,因为我可能根本无法识别出不寻常的事情正在发生。例如这个:

e = sum(xrange(100000000))
print('e is {}'.format(e))

f = np.arange(100000000).sum()
print('f is {}'.format(f))

给出这个:

e is 4999999950000000
f is 887459712

猜想这与数据类型有关,实际上即使使用 python float 似乎也能解决问题:

e = sum(xrange(100000000))
print('e is {}'.format(e))

f = np.arange(100000000, dtype=float).sum()
print('f is {}'.format(f))

给予:

e is 4999999950000000
f is 4.99999995e+15

我没有 Comp 背景。科学。并发现自己被困住了(也许这是一个骗局)。我尝试过的事情:

  1. numpy 数组具有固定大小。没有; this似乎表明我应该首先遇到 MemoryError
  2. 我可能以某种方式安装了 32 位(可能不相关);不,我跟着this并确认我有 64 位。
  3. 奇怪的 sum 行为的其他例子;没有 (?) 我找到了 this但我看不出它是如何应用的。

有人可以简要解释一下我缺少的内容并告诉我需要阅读哪些内容吗?此外,除了记住每次都定义一个 dtype 之外,有没有办法阻止这种情况发生或发出警告?

可能相关:

Windows 7

numpy 1.11.3

在 Python 2.7.9 上运行 Enthought Canopy

最佳答案

在 Windows 上(也在 64 位系统上)如果从 Python 整数转换为 32 位,NumPy 使用的默认整数。在 Linux 和 Mac 上它是 64 位的。

指定一个 64 位整数,它将起作用:

d = np.arange(200000, dtype=np.int64).sum()
print('d is {}'.format(d))

输出:

c is 19999900000
d is 19999900000

虽然不是最优雅的,但你可以做一些monkey patching , 使用 functools.partial :

from functools import partial

np.arange = partial(np.arange, dtype=np.int64)

从现在开始,np.arange 默认使用 64 位整数。

关于python - numpy.sum() 在大数组上给出奇怪的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41705764/

相关文章:

python - Django 1.2 对象级权限 - 第三方解决方案?

python - OpenERP - 将数据复制到不同表中的新记录 - 费用/采购订单

python - 如何使用反向二进制表示重新索引 numpy 数组?

python - 将 GroupBy 对象 (groupby().size) 转换为字典

Python没有名为numpy的模块

python - 如何在opencv python中调整PNG图像的大小?

python - NumPy 数组的反向堆叠操作

python - 如何在 Python 中覆盖 'lambda'?

python - 为什么使用sum()函数会出现 'int' object is not callable错误?

python - 是否可以将其包装在 Python "with"语句中?