2012-02-04 26 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

相關問題