Numpy:是否有数组大小限制?

时间:2009-08-18 19:33:20

标签: python 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 sum函数?

感谢您的帮助

3 个答案:

答案 0 :(得分:9)

当数字大于32位int时,标准列表切换到使用long类型进行算术运算。

numpy数组没有切换到long,并且遇到整数溢出。速度的价格是允许的较小值范围。

>>> 499999500000 % 2**32
1783293664L

答案 1 :(得分:9)

Numpy正在创建一个32位无符号整数数组。 当它们相加时,它将它们加总为32位值。

if 499999500000L % (2**32) == 1783293664L:
    print "Overflowed a 32-bit integer"

您可以在阵列创建时明确选择数据类型:

a = numpy.arange(1000000, dtype=numpy.uint64)
a.sum() -> 499999500000

答案 2 :(得分:6)

请注意499999500000 % 2**32完全等于1783293664 ...即,numpy正在进行模2 * 32的操作,因为这是你告诉它使用的numpy.array的类型。

例如,

制作np_array = numpy.arange(1000000, dtype=numpy.uint64),你的总和就会好(虽然当然还有限制,任何有限大小的数字类型)。

您可以使用dtype=numpy.object告诉numpy该数组包含通用Python对象;当然,随着普遍性的增加,表现会衰退。