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

Nop*_*ope 3 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
Run Code Online (Sandbox Code Playgroud)

python_list总和是正确的.

如果我使用总和为1000的相同代码,则两者都打印正确的答案.Numpy数组的长度是上限还是Numpy sum函数?

谢谢你的帮助

S.L*_*ott 9

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

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

>>> 499999500000 % 2**32
1783293664L
Run Code Online (Sandbox Code Playgroud)


Joe*_*erg 9

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

if 499999500000L % (2**32) == 1783293664L:
    print "Overflowed a 32-bit integer"
Run Code Online (Sandbox Code Playgroud)

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

a = numpy.arange(1000000, dtype=numpy.uint64)
a.sum() -> 499999500000
Run Code Online (Sandbox Code Playgroud)


Ale*_*lli 6

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

制作np_array = numpy.arange(1000000, dtype=numpy.uint64),例如,你的总和会出来OK(尽管当然还是有限制,任何有限尺寸号码类型).

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