我正在模拟两种不同物种的粒子碰撞。我正在使用一个类来定义每个物种和一个用于保持粒子位置和速度的数组的类。
当发生碰撞时,我必须将粒子A的粒子速度与粒子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 :(得分: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方法来执行交换,但这应该有效。