【发布时间】:2017-06-02 00:36:44
【问题描述】:
我似乎发现了在 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 的背景。科学。并发现自己陷入困境(也许这是一个骗局)。我尝试过的事情:
-
numpy数组具有固定大小。没有; this 似乎表明我应该先点击MemoryError。 - 我可能以某种方式安装了 32 位(可能不相关);不,我关注了this 并确认我有 64 位。
- 其他奇怪的
sum行为示例;不(?)我找到了this,但我看不出它是如何应用的。
有人可以简要解释一下我缺少什么并告诉我需要阅读什么吗?此外,除了记住每次都定义一个dtype 之外,有没有办法阻止这种情况发生或发出警告?
可能相关:
Windows 7
numpy1.11.3
在 Python 2.7.9 上用完 Enthought Canopy
【问题讨论】:
-
可能是因为
numpy整数依赖于 C 类型的整数,而 python 具有无限的整数范围。花车是……花车。它们可能非常高。 -
检查
np.arange(5).dtype。它可能使用 32 位整数而不是 64 位。此外,请确保您在同一个 Python 安装上执行所有这些检查。 -
看起来像是某种溢出...整数的符号似乎也被覆盖了,这可能是您有时会得到负面结果的原因。
-
@user2357112 确实在打印
dtype('int32')
标签: python python-2.7 numpy