2017-08-24 16 views
0

FCC格子の座標の配列を作成するコードを開始します。ここに私のコードは便利print文で、これまでのところです:Python - 元の配列を変更すると、別のメモリ位置の変更

def init_FCC(a, x_rep,y_rep,z_rep): 
    n_atoms = 4*x_rep*y_rep*z_rep 
    UC = array([[0, 0, 0],[(a/2),(a/2),0],[(a/2), 0, (a/2)],[0,(a/2),(a/2)]]) 
    coords = UC[:] 
    print(array_equal(coords,UC)) 
    for n in range(x_rep): 
     if array_equal(coords,UC) == False: 
      coords = vstack((coords, UC)) 
     UC[:,0] += a 
     print(UC,id(UC)) 
     print(coords,id(coords),'\n',60*'*') 
    return(coords) 

例A = 5、のために、機能を使用してx_rep = 3は、print文は、if文は、配列、すなわち真決してないことを示します " UCとcoordsは常に同じです。しかし、あなたが見ることができるように、if文の直後では、forループが繰り返されるたびに、UCの最初の列を変更しますが、coordsは変更しません。私はそれぞれのIDが異なるメモリの場所であることを確認しました。 UCの変更時に配列の座標が変化するのはなぜですか?これを防ぐにはどうすればよいですか?後で、これはおそらく、FCC格子を作成する最終目的を達成するための最良の方法ではないが、私自身のコードを作りたいと思っている。

ありがとうございました。あなたはちょうど同じオブジェクトの新しい「ラベル」を作成しているvarr_array2 = var_array1を行う際

+1

ここで 'coords'を' coords = vstack((coords、UC)) 'に再割り当てします。新しいメモリの場所です。 – Alexander

+1

'array'、' array_equal'、 'v_stack'のどれも定義されていません。 –

+0

array、array_equal、およびvstackはすべてnumpy関数です。私が質問に述べたように、if文は決してTrueではなく、vstack操作は決して実行されません。私は別の印刷ステートメントでこれを確認しましたが、それを含めないと謝罪します。 –

答えて

1

、これらの例を参照してください。

a = np.array([[0,0,0],[1,1,1], [2,2,2], [3,3,3]]) 
b = a 

print (a is b) 
True 

c = a.copy() 
print (a is c) 
False 

b[0] = [0,0,0] 
print (a) 
[[0 0 0] 
[1 1 1] 
[2 2 2] 
[3 3 3]] 

c[0] = [9,9,9] 
print (a) 
[[0 0 0] 
[1 1 1] 
[2 2 2] 
[3 3 3]] 

print(c) 
[[9 9 9] 
[1 1 1] 
[2 2 2] 
[3 3 3]] 

結論:使用array.copy()を。

+0

ありがとうございます。このソリューションは機能します。しかし、私はまだ理解していません coords = UC [:] または coords = list(UC) は動作しません。それらのIDによれば、それらは別々のオブジェクトです。どんな洞察? –

0

coords = UC[:]は、アレイ上に代替ビューを提供しますが、コピーはありません。 coords = UC.copy()が必要です。

関連する問題