2016-10-31 9 views
0

Я моделирую столкновение частиц двух разных видов. Я использую класс для определения каждого вида и класса для массивов, которые занимают позиции частиц и скорость.Переменные элементы в массиве, определенные в классе python

Когда происходит столкновение я должен поменять местами скорости частицы звонкой А со скоростью частицы звонкой B.

классы определены в отдельном файле, как:

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 для выполнения swap, но это должно работать.

 Смежные вопросы

  • Нет связанных вопросов^_^