2012-02-04 53 views
11

我有以下代码:NumPy的错误:在功率遇到无效值

import numpy 

def numpysum(n): 
    a = numpy.arange(n) ** 2 
    b = numpy.arange(n) ** 3 
    c = a + b 
    return c 


size = 3000 
c = numpysum(size) 

运行时,我得到的错误:

D:\Work\programming\python\test_1\src\test1_numpy.py:6: RuntimeWarning: invalid value encountered in power b = numpy.arange(n) ** 3

注意以下numpyless功能正常工作:

def pythonsum(n): 
    a = list(range(n)) 
    b = list(range(n)) 
    c = [] 
    for i in range(len(a)): 
     a[i] = i ** 2 
     b[i] = i ** 3 
     c.append(a[i] + b[i]) 
    return c 

我想这是因为我试图筹集大量的权力三。除了使用浮点数之外,我能做些什么?

我正在使用Python 3.2。

+0

:代码运行fine.Maybe你做了某事其他导致错误? – George 2012-02-04 12:17:11

+1

它会在你的系统上运行'size = 1000'吗?那么这是一个数据类型问题 - 考虑在'arange()'中设置'dtype'参数。 – krlmlr 2012-02-04 12:30:01

回答

16

numpy实际上是在寻找你的这一个。在标准Python中unlke,其整数运算不适用于任意精度对象。我猜你正在运行的是32位的蟒蛇,因为相同的操作,我不溢出:

>>> sys.maxsize 
9223372036854775807 
>>> size = 3000 
>>> c = numpysum(size) 
>>> 

,但终会。更容易看到,如果你控制手动型的大小:

>>> numpy.arange(10, dtype=numpy.int8)**10 
__main__:1: RuntimeWarning: invalid value encountered in power 
array([ 0, 1, 0, -87, 0, -7, 0, -15, 0, 0], dtype=int8) 
>>> numpy.arange(10, dtype=numpy.int16)**10 
array([  0,  1, 1024, -6487,  0, 761, -23552, 15089, 
      0,  0], dtype=int16) 
>>> numpy.arange(10, dtype=numpy.int32)**10 
array([   0,   1,  1024,  59049,  1048576, 
      9765625, 60466176, 282475249, 1073741824, -2147483648], dtype=int32) 
>>> numpy.arange(10, dtype=numpy.int64)**10 
array([   0,   1,  1024,  59049, 1048576, 
      9765625, 60466176, 282475249, 1073741824, 3486784401]) 

里的东西提高随着位数的增加。如果你真的想在Python中的任意大小的整数numpy的阵列操作,您可以设置到D型对象:

>>> numpy.arange(10, dtype=object)**20 
array([0, 1, 1048576, 3486784401, 1099511627776, 95367431640625, 
     3656158440062976, 79792266297612001, 1152921504606846976, 
     12157665459056928801], dtype=object) 
+1

谢谢。的确,它是Python 32位。 – lmsasu 2012-02-04 13:17:14

相关问题