2016-10-31 34 views
0

我正在建模兩個不同物種的粒子碰撞。我正在使用一個類來定義每個物種和一個擁有粒子位置和速度的陣列類。交換python類中定義的數組中的元素

當發生碰撞時我有硬幣B.

類是在一個單獨的文件定義爲顆粒的速度交換物種A的粒子的速度:

class Particle(object): 
    def __init__(self,num): 
     self.x=numpy.zeros((num,1)) #Position 
     self.v=numpy.zeros((num,3)) #Velocity 

class Species(object): 
    def __init__(self): 
     self.mass=[] 
     self.spwt=[] 
     self.np=[] 
     self.np_alloc=[] 
     self.part=[] 

物種是在主文件中創建:

#variables to hold species 
A = struct.Species() 
B = struct.Species() 

#set species data 
A.mass = 1  
A.np = 0 
A.spwt=spwt 
A.np_alloc = num 
A.part = struct.Particle(A.np_alloc) 


B.mass = 1  
B.np = 0 
B.spwt=spwt 
B.np_alloc = int(cloud_den/spwt/cloud_len) 
B.part = struct.Particle(B.np_alloc) 

,當我嘗試換速度的顆粒

print A.part.v[p1] 
print B.part.v[p2] 

A.part.v[p1],B.part.v[p2]=B.part.v[p2],A.part.v[p1] 

print A.part.v[p1] 
print B.part.v[p2] 

輸出是:

[ 1000. 0. 0.] 
[ 0. 0. 0.] 
[ 0. 0. 0.] 
[ 0. 0. 0.] 

回答

0

的問題與numpy的,不是換一個類的內部元素。

當您:

A.part.v[p1] 

你創建你陣列的視圖。相反,您需要創建副本:

c = numpy.copy(A.part.v[p1]) 
A.part.v[p1] = B.part.v[p2] 
B.part.v[p2] = c 

這應該有效。

也許有更多pythonic方法來執行交換,但這應該工作。