2017-10-22 6 views
-1

私のnumpy配列の変更で奇妙な動作があります。それはおそらく、Pythonで「通常」の動作ですが、私は本当にこの関連リンク言語に慣れていないです:1つのnumpy配列を変更しますが、2を変更します...?

B=[[1,2,3],[4,5,6],[7,8,9]] 

b=np.asarray(B) 
c=b 
print("I display b :") 
print(b) 
c[0,0]=-c[0,0] # I multiply this coordinates by -1 


print("I display c (modified at the right place : ok)") 
print(c) 
print("But b has also been modified ???!!!") 
print(b) 

出力:

I display b : 
[[1 2 3] 
[4 5 6] 
[7 8 9]] 
I display c (modified at the right place : ok) 
[[-1 2 3] 
[ 4 5 6] 
[ 7 8 9]] 
But b has also been modified ???!!! 
[[-1 2 3] 
[ 4 5 6] 
[ 7 8 9]] 

bが、私はそれを変更したことがない場合でも、変更されているのはなぜ?私はただCを変えました...?

+0

'C = B'を** **新しいオブジェクトを作成しません。 – jonrsharpe

答えて

4

pythonは参照によって動作しますので、c=bを設定すると、両方とも同じオブジェクトを参照しています。したがって、cへの変更はbに影響します。 あなたは、次の操作を実行したい場合があります:

import copy 
c = copy.copy(b) 

これは、新しいオブジェクトとしてCを作成し、それはもうBは影響しません変更します。

またはnumpyのを使用して:

c = np.copy(b) 
+0

numpyには独自のコピー機能があります。しかし、どちらがより効果的かは不明だ。私はnumpyと思われますが、パフォーマンスが問題であればプロファイリングする価値があります。 –

+0

真実ですが、彼の例のような大きさであれば、その差は無視できるものと考えられます。 – riadrifai

+0

はい、もちろんです。しかし、大きな問題を抱えている場合、人々はここではすっきりした例を投稿することが多いが、大きな問題を抱えている人々がこの答えに出くわすことがある。 –

1

Cはただの別名です。配列をコピーする場合は、c = np.copy(b)を使用します。すでにコピー方法を言及したことに加え

0

、あなたはこのような変数cのためのコピーを作成することができます。

B=[[1,2,3],[4,5,6],[7,8,9]] 
b=np.asarray(B) 
c = b.copy() 

c[1, 1] = 15 
print(b) 
print(c) 

は、このようなあなたの出力与える:

[[1 2 3] 
[4 5 6] 
[7 8 9]] 
[[ 1 2 3] 
[ 4 15 6] 
[ 7 8 9]] 
関連する問題