我似乎发现了在 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
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/