Numpy:数组大小有限制吗?

3 投票
3 回答
5615 浏览
提问于 2025-04-15 13:41

我正在学习使用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

撰写回答