我似乎发现了使用numpy
数组上的.sum()
存在陷阱,但我无法找到解释。基本上,如果我尝试对一个大数组求和,那么我开始得到荒谬的答案,但这种情况会默默地发生,我不能很好地理解输出结果以便通过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
我没有计算机科学背景,发现自己陷入了困境(也许这是一个重复的问题)。 我尝试过以下方法:
numpy
数组具有固定大小。 不行; 这个似乎表明我应该首先遇到MemoryError
。- 我可能以某种方式安装了32位版本(可能不相关); 不行,我遵循这个并确认我的版本是64位的。
- 其他奇怪的
sum
行为示例; 不行(?)我找到了这个但我看不出它如何适用。
请问有人能简要解释一下我错过了什么,并告诉我需要阅读什么内容吗? 此外,除了记得每次定义dtype
之外,是否有一种方法可以停止这种情况或发出警告?
可能相关:
Windows 7
numpy
1.11.3
在Python 2.7.9上运行Enthought Canopy。
numpy
整数依赖于C类型整数,而Python具有无限的整数范围。浮点数是...浮点数。它们可以非常高。 - Jean-François Fabrenp.arange(5).dtype
。它可能使用的是32位整数而不是64位。此外,请确保您在同一个Python安装上执行所有这些检查。 - user2357112dtype('int32')
。 - roganjosh