我似乎.sum()在numpy数组上使用时发现了一个陷阱,但是我找不到解释。本质上,如果我尝试对一个大数组求和,那么我会开始得到荒谬的答案,但这是 无声的, 而且我无法充分理解输出结果,而不是Google的原因。
.sum()
numpy
例如,这完全按预期工作:
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可以解决问题:
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的背景。科学 发现自己被卡住了(也许这是骗子)。我尝试过的事情:
MemoryError
sum
有人可以简要解释一下我所缺少的内容,然后告诉我我需要阅读哪些内容吗?另外,除了记得定义dtype每次,还可以阻止这种情况发生或发出警告吗?
dtype
可能相关:
Windows 7的
numpy 1.11.3
在Python 2.7.9上用完了有思想的机盖
显然这是numpy的整数类型,溢出32位。通常,您可以使用以下命令将numpy配置为在这种情况下失败np.seterr:
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开发人员修复。