如何在 类 中组合相同的变量

How to combine same variables in classes

正在尝试创建 n 体模拟,目前正在创建粒子 class。我通过输入一些变量(例如位置和速度)来初始化 class。我想知道我是否可以以某种方式将所有相同的变量组合到一个数组中。例如,当我调用粒子 class 时,它会保存所有变量,但变量都是关于那个特定粒子并与之相关联的。我想知道我是否能够找到一种方法 return 一个阵列中所有粒子的速度。

class Particle:

    Position = np.full((1, 3), 0, dtype=float)
    Velocity = np.full((1, 3), 0, dtype=float)
    Acceleration = np.full((1, 3), 0, dtype=float)
    Name = np.full((1, 1), 0, dtype=float)
    Mass = np.full((1, 1), 0, dtype=float)

    """Initialisng all all the data members for each Particle"""

    def __init__(self, Name, Mass, initPosition, initVelocity, initAcceleration):
        self.Name = Name
        self.Mass = Mass
        self.Position = np.array(initPosition)
        self.Velocity = np.array(initVelocity)
        self.Aceleration = np.array(initAcceleration)

    def arrays(self, Positions, Velocities, Accelerations, Names, Masses):
        Positions.append(self.Position)
        Velocities.append(self.Velocity)
        Accelerations.append(self.Acceleration)
        Names.append(self.Name)
        Masses.append(self.Mass)

我的第二个定义“数组”试图做到这一点,但没有成功。目的是让我可以键入 Positions 并生成一个 (N,3) 矩阵,我可以在该矩阵上执行计算。这可能吗?

def arrays(self, Positions, Velocities, Accelerations, Names, Masses):
   self.Positions.append(Position)
   self.Velocities.append(Velocity)
   self.Accelerations.append(Acceleration)
   self.Names.append(Name)
   self.Masses.append(Mass)

实际上,'numpy.ndarray' object has no attribute 'append'

使用 numpyappend

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

并且注意执行的结果一定要赋值,否则什么都不加

我不确定你到底想做什么:

如果你想更新和return 一个的所有positions/velocities粒子对象那么你可以定义:

def arrays(self, Positions, Velocities, Accelerations, Names, Masses):
    self.Positions = np.append(self.Position, Position)
    self.Velocities = np.append(self.Velocity, Velocity)
    self.Accelerations = np.append(self.Acceleration, Acceleration)
    self.Names = np.append(self.Name, Name)
    self.Masses = np.append(self.Mass, Mass)

然后您可以访问 class 属性,例如:

p1 = Particle(...)
p1.Positions

您可以从外部更新您的粒子属性并可以访问它。

但是在你的情况下(我猜至少)你可能需要多个粒子对象。所以最好定义一个新的 class 以粒子集合 [Particle(*args, **kwargs), Particle(*args, **kwargs), ...] 作为输入然后你可以访问所有粒子属性,随心所欲。