代码之家  ›  专栏  ›  技术社区  ›  Nope

Numpy:数组大小有限制吗?

  •  3
  • Nope  · 技术社区  · 17 年前

    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_列表和是正确的。

    如果我使用相同的代码,求和到1000,两个都会打印正确的答案。Numpy数组的长度是否有上限,或者是否使用Numpy sum函数?

    谢谢你的帮助

    3 回复  |  直到 17 年前
        1
  •  9
  •   S.Lott    17 年前

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

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

    >>> 499999500000 % 2**32
    1783293664L
    
        2
  •  9
  •   Joe Koberg    17 年前

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

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

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

    a = numpy.arange(1000000, dtype=numpy.uint64)
    a.sum() -> 499999500000
    
        3
  •  6
  •   Alex Martelli    17 年前

    499999500000 % 2**32 正好等于1783293664。。。i、 例如,numpy执行的是模2**32的操作,因为这是您告诉它要使用的numpy.array的类型。

    制作 np_array = numpy.arange(1000000, dtype=numpy.uint64) ,那么你的总和就可以了(当然,对于任何有限大小的数字类型,仍然有限制)。

    dtype=numpy.object 告诉numpy数组包含通用Python对象;当然,性能会随着通用性的增加而下降。