2012-02-04 13 views
11

Mam następujący kod:błąd Numpy: nieprawidłowa wartość napotkał u władzy

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) 

Po uruchomieniu pojawia się błąd:

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

pamiętać, że poniższe funkcje numpyless działa prawidłowo:

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 

Sądzę, że tak się dzieje, ponieważ próbuję podnieść dużą liczbę, by zasilić trzy. Co mogę zrobić, oprócz pracy z liczbami zmiennoprzecinkowymi?

Pracuję z Pythonem 3.2.

+0

: Kod uruchamia fine.Maybe zrobiłeś czegoś innego, co powoduje błąd? – George

+1

Czy będzie działać z 'size = 1000' w twoim systemie? Następnie jest to problem typu danych - rozważ ustawienie parametru 'dtype' w' arange() '. – krlmlr

Odpowiedz

16

numpy naprawdę na ciebie czeka. Odłącz w standardowym języku Python, jego operacje całkowite nie działają na obiektach o dowolnej dokładności. Przypuszczam zostałeś uruchomiony 32-bitowy Python, ponieważ te same operacje nie przepełnienie dla mnie:

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

ale ostatecznie. Jeszcze łatwiej jest sprawdzić, czy ręcznie kontrolujesz rozmiar tego typu:

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

gdzie sytuacja się poprawia wraz ze wzrostem liczby bitów. Jeśli naprawdę chcesz NumPy operacje na tablicy liczb całkowitych Pythona arbitralne wielkości, można ustawić dtype sprzeciwu:

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

Dzięki. W rzeczywistości jest to 32-bitowy python. – lmsasu

Powiązane problemy