2012-02-04 2 views
11

나는 다음과 같은 코드가 다음 numpyless 기능이 잘 작동하는지NumPy와 오류 : 전원에서 발생하는 잘못된 값

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

참고 :

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) 

실행, 나는 오류가

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 

전원을 공급하기 위해 많은 수를 늘리려고하기 때문에 발생하는 것 같습니다. 부동 소수점 숫자로 작업하는 것 외에 무엇을 할 수 있습니까?

저는 파이썬 3.2를 사용하고 있습니다.

+0

: 코드가 정상적으로 실행됩니다. 오류가 발생한 sth을 수행 한 적이 있습니까? – George

+1

시스템에서'size = 1000'으로 실행됩니까? 그런 다음 데이터 유형 문제입니다.'arange()'에'dtype' 매개 변수를 설정하십시오. – krlmlr

답변

16

numpy는 실제로이 문제에 대해 당신을 찾고 있습니다. 표준 파이썬에서는 그 정수 연산이 임의 정밀도 객체에서는 작동하지 않습니다. 저도 같은 작업이 나를 위해 오버 플로우를하지 않기 때문에 당신이 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]) 

. 파이썬 임의 크기 정수에서 numpy 배열 연산을 원할 경우 dtype을 객체로 설정할 수 있습니다.

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

감사합니다. 사실 파이썬 32 비트입니다. – lmsasu