2017-12-19 7 views
1

私は関数を以下のように定義します。EmiCtry,percapitaおよびyearはグローバルパラメータです。私は異なったshresholdramprateを選ぶという効果を見たいと思います。Pythonは定義された関数でループしますが、奇妙な値を出力します

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) 

は出力が> 0 iiのために奇妙であり、各ループtmp = EmiCtryがまったく動作しませんした後、それはそうです。つまり、ii = 3の場合、tmp = EmiCtryii = 2のときにtmpの値を使用します。

ただし、ループの前にtmp1, tmp2 = annual_emi_scale(80, 0.00)を実行すると、結果は正しくなります。しかし、ループの後に置くと、同じことが再び起こります。

EmiCtry

は、他のデータから計算し、float型の値を持つ numpy.array()です: co2EmiCtry = original_data.astype(np.float)

+0

を使用し、配列の独立したコピーを作成します。 – kindall

+1

あなたはこのコードが何をすべきか、なぜ結果が "奇妙"なのかを記述してください。 – mkrieger1

+1

'annual_emi_scale'または' main'ループの中で使われている 'i'を意味しますか? – mkrieger1

答えて

1

はあなたが元に影響を与えるためにtmp上の変更を防ぐために、アレイEmiCtryをコピーする必要があります。

あなたのラインtmp = EmiCtryは、tmpという名前をEmiCtryが指しているのと同じオブジェクトにバインドするだけです。どちらの名前もメモリ内の同じ場所を指しています。一方を変更すると、他方も変更されます。

問題の非常に便利なステートメントではありません「まったく機能しません」tmp = numpy.copy(EmiCtry)

+0

素晴らしい!これはうまくいきます!私はPython '='で2つの変数間のリンクを作成していますが、コピーを作成していないことを覚えています...ありがとう! –

関連する問題