2012-02-04 18 views
11

Tengo el siguiente código:error Numpy: valor no válido encontrado en el poder

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) 

Cuando se ejecuta, me sale el error:

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

Tenga en cuenta que la siguiente función numpyless funciona bien:

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 

Supongo que sucede porque trato de aumentar un número grande para alimentar a tres. ¿Qué puedo hacer, además de trabajar con números de coma flotante?

Estoy trabajando con Python 3.2.

+0

: El código se ejecuta fine.Maybe que hizo algo más que hace que el error? – George

+1

¿Funcionará con 'size = 1000' en su sistema? Entonces es un problema de tipo de datos: considere configurar el parámetro 'dtype' en' arange() '. – krlmlr

Respuesta

16

numpy en realidad está cuidando de usted en este caso. Unlke en Python estándar, sus operaciones enteras no funcionan en objetos de precisión arbitraria. Supongo que se estaba ejecutando una pitón de 32 bits, ya que los mismos no lo hacen operaciones de desbordamiento para mí:

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

pero que a la larga. Aún más fácil de ver si se controla el tamaño del tipo de forma manual:

>>> 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]) 

donde las cosas mejoran a medida que el número de bits aumenta. Si realmente desea que las operaciones de matriz numpy en Python enteros de tamaño arbitrario, se puede establecer a dtype objeto:

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

Gracias. De hecho, es python 32 bit. – lmsasu

Cuestiones relacionadas