Numpy:数组大小有限制吗?
我正在学习使用Numpy,想看看对一串数字求和的速度差别,所以我写了这段代码:
np_array = numpy.arange(1000000)
start = time.time()
sum_ = np_array.sum()
print time.time() - start, sum_
>>> 0.0 1783293664
python_list = range(1000000)
start = time.time()
sum_ = sum(python_list)
print time.time() - start, sum_
>>> 0.390000104904 499999500000
用python_list求和的结果是正确的。
如果我用同样的代码对1000求和,两个都能打印出正确的答案。请问Numpy数组的长度有没有上限,还是说是Numpy的求和函数有问题?
谢谢你的帮助!
3 个回答
6
注意到 499999500000 % 2**32
的结果正好是 1783293664……也就是说,numpy 在进行运算时是按照 2 的 32 次方来计算的,因为你告诉它使用的就是这种类型的 numpy.array。
比如说,如果你使用 np_array = numpy.arange(1000000, dtype=numpy.uint64)
,那么你的总和就会正常计算出来(当然,任何有限大小的数字类型还是有它的限制)。
你可以使用 dtype=numpy.object
来告诉 numpy 这个数组里存的是普通的 Python 对象;不过,随着通用性增加,性能会有所下降。
10
标准列表在处理比32位整数更大的数字时,会自动转换为长整型(long type)来进行计算。
而numpy数组没有进行这样的转换,所以当数字超出它能处理的范围时,就会出现整数溢出的问题。为了提高速度,它允许的数值范围就比较小。
>>> 499999500000 % 2**32
1783293664L
10
Numpy正在创建一个由32位无符号整数(也就是非负整数)组成的数组。当它对这些数进行求和时,结果也是一个32位的数。
if 499999500000L % (2**32) == 1783293664L:
print "Overflowed a 32-bit integer"
你可以在创建数组的时候明确选择数据类型:
a = numpy.arange(1000000, dtype=numpy.uint64)
a.sum() -> 499999500000