2017-12-19 4 views
1

다음과 같이 함수를 정의합니다. EmiCtry, percapitayear은 전역 매개 변수입니다. 다른 shresholdramprate을 선택하면 효과를보고 싶습니다.정의 된 함수를 사용하여 루핑하고 이상한 값을 출력합니다.

def annual_emi_scale(shreshold, ramprate): 
    tmp = EmiCtry 
    for i in range(177): 
     for j in range(91): 
      if percapita[i,j] >= shreshold and year[j] >= 2020: 
       tmp[i,j] = tmp[i,j] * (1.-ramprate) 
    adj1 = cdutil.averager(tmp, axis=0,weights='equal',action='sum') 
    adj2 = cdutil.averager(adj1,axis=0,weights='equal',action='sum') 
    return adj1, adj2 

는 다음 나는 정의 함수와 루프를 수행

emi = np.zeros([25, 91]) 
cum = np.zeros([5,5]) 
for ii in range(5): 
    shre = (ii + 1) * 20 
    for jj in range(5): 
     ramp = jj * 0.02 
     emi[ii*5+jj],cum[ii,jj] = annual_emi_scale(shre, ramp) 

출력은 ii> 0 이상이며, 각 루프 tmp = EmiCtry 전혀 작동하지 않습니다 후 보인다. 즉, ii = 3의 경우 일 때 tmp = EmiCtry은 tmp 값을 사용합니다.

그러나 루프 전에 tmp1, tmp2 = annual_emi_scale(80, 0.00)을 수행하면 결과가 정확합니다. 그러나 루프를 돌릴 때 같은 일이 다시 발생합니다.

EmiCtry

다른 데이터로부터 계산 플로트 식의 값을 갖는 numpy.array()이다 : co2EmiCtry = original_data.astype(np.float)

+0

는 "전혀 작동하지 않습니다"를 사용하려면 문제의 매우 유용한 문이 아니다. – kindall

+1

이 코드가 수행해야 할 작업과 결과가 "이상한"이유를 설명해주십시오. – mkrieger1

+1

'annual_emi_scale' 또는'main' 루프에서 사용되는'i'를 의미합니까? – mkrieger1

답변

1

는 원본에 영향을 tmp의 변형을 방지하기 위해 배열 EmiCtry를 복사 할 필요가있다.

라인 tmp = EmiCtrytmp이라는 이름을 EmiCtry이 가리키는 것과 동일한 객체에 바인딩합니다. 두 이름 모두 메모리의 동일한 위치를 가리 킵니다. 하나를 수정하면 다른 하나도 수정됩니다.

배열의 독립적 인 복사, tmp = numpy.copy(EmiCtry)

+0

좋아요! 이것은 효과가있다! 나는 파이썬에서'='두 변수 사이에 링크를 만들지 만 사본을 만들지는 않는다는 것을 기억하기 시작합니다 ... 고마워요! –