2012-02-04 12 views
11

Ho il seguente codice:errore Numpy: valore non valido incontrato nel potere

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) 

Durante l'esecuzione, ottengo l'errore:

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

Si noti che la seguente funzione numpyless funziona bene:

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 

Immagino che accada perché provo a generare un numero elevato per il terzo. Cosa posso fare, oltre a lavorare con i numeri in virgola mobile?

Sto lavorando con Python 3.2.

+0

: Il codice viene eseguito fine.Maybe hai fatto qlc altra cosa che causa l'errore? – George

+1

Funzionerà con 'size = 1000' sul tuo sistema? Quindi si tratta di un problema relativo al tipo di dati: prendere in considerazione l'impostazione del parametro 'dtype' in' arange() '. – krlmlr

risposta

16

numpy sta cercando proprio su questo. Unlke in Python standard, le sue operazioni su interi non funzionano su oggetti di precisione arbitraria. Direi si stesse eseguendo un 32 bit di pitone, in quanto le stesse operazioni non lo fanno troppo pieno per me:

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

ma alla fine farò. Ancora più facile da vedere se si controlla la dimensione del tipo manualmente:

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

dove le cose migliorano con l'aumentare del numero di bit. Se si vuole veramente le operazioni di matrice NumPy su Python interi arbitrari dimensioni, è possibile impostare DTYPE per oggetto:

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

Grazie. In effetti, è python a 32 bit. – lmsasu

Problemi correlati