小编典典

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

python

我似乎.sum()numpy数组上使用时发现了一个陷阱,但是我找不到解释。本质上,如果我尝试对一个大数组求和,那么我会开始得到荒谬的答案,但这是
无声的, 而且我无法充分理解输出结果,而不是Google的原因。

例如,这完全按预期工作:

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数组具有固定的大小。不; 这似乎表明我应该打MemoryError第一个。
  2. 我可能以某种方式进行了32位安装(可能不相关);是的,我遵循了这一点,并确认我具有64位。
  3. 怪异sum行为的其他示例;没了( )我发现这个,但我看不出它如何应用。

有人可以简要解释一下我所缺少的内容,然后告诉我我需要阅读哪些内容吗?另外,除了记得定义dtype每次,还可以阻止这种情况发生或发出警告吗?

可能相关:

Windows 7的

numpy 1.11.3

在Python 2.7.9上用完了有思想的机盖


阅读 217

收藏
2020-12-20

共1个答案

小编典典

显然这是numpy的整数类型,溢出32位。通常,您可以使用以下命令将numpy配置为在这种情况下失败np.seterr

>>> import numpy as np
>>> np.seterr(over='raise')
{'divide': 'warn', 'invalid': 'warn', 'over': 'warn', 'under': 'ignore'}
>>> np.int8(127) + np.int8(2)
FloatingPointError: overflow encountered in byte_scalars

但是,sum已明确记录了行为“ 溢出时不会引发错误 ”,因此您在这里可能不走运。为了方便起见,使用numpy通常是性能的折衷!

但是,您可以手动为累加器指定dtype,如下所示:

>>> a = np.ones(129)
>>> a.sum(dtype=np.int8)  # will overflow
-127
>>> a.sum(dtype=np.int64)  # no overflow
129

观看票号593,因为这是一个未解决的问题,它可能由numpy开发人员修复。

2020-12-20