gpt4 book ai didi

python - 如何有效结合类设计和矩阵数学?

转载 作者:太空狗 更新时间:2023-10-29 21:39:17 25 4
gpt4 key购买 nike

一段时间以来,我一直为物理系统建模的两种设计理念的冲突所困扰,我想知道社区为此提出了什么样的解决方案。

对于复杂的(呃)模拟,我喜欢为对象创建类的抽象以及类的对象实例如何与我想研究的真实对象识别,以及对象的某些属性如何表示对象的物理特征现实生活中的对象。让我们以弹道粒子系统为例:

class Particle(object):
def __init__(self, x=0, y=0, z=0):
self.x = x
self.y = y
self.z = z
def __repr__(self):
return "x={}\ny={}\nz={}".format(self.x, self.y, self.z)
def apply_lateral_wind(self, dx, dy):
self.x += dx
self.y += dy

如果我用一百万个值初始化它,我可能会这样做:

start_values = np.random.random((int(1e6),3))

particles = [Particle(*i) for i in start_values]

现在,让我们假设我需要对我所有的粒子做一些特定的事情,比如添加一个横向风矢量,只是导致这个特定操作的 x,y 偏移,因为我只有一堆(列表)所有我的粒子,我需要遍历我所有的粒子才能做到这一点,它需要这样的时间:

%timeit _ = [p.apply_lateral_wind(0.5, 1.2) for p in particles]
1 loop, best of 3: 551 ms per loop

现在,显然更有效的反对范式是停留在 numpy 级别,直接对数组进行数学运算,效率超过 10 倍更快:

%timeit start_values[...,:2] += np.array([0.5,1.2])
10 loops, best of 3: 20.3 ms per loop

我现在的问题是,是否有任何设计模式可以有效地结合这两种方法,从而不会损失那么多效率?我个人发现根据对象方法和属性来思考真的更容易,在我的脑海中更清晰,对我来说也是面向对象编程成功的根本原因(或者它在(物理)建模中的使用) .但缺点也很明显。如果在这些方法之间有某种优雅的来回可能,我会很高兴吗?

最佳答案

您可以定义一个类来处理多个粒子:

class Particles(object):
def __init__(self, coords):
self.coords = coords

def __repr__(self):
return "Particles(coords={})".format(self.coords)

def apply_lateral_wind(self, dx, dy):
self.coords[:, 0] += dx
self.coords[:, 1] += dy

start_values = np.random.random((int(1e6), 3))
particles = Particles(start_values)

我系统上的时间显示这实际上比您的 numpy 版本更快,大概是因为它没有构造额外的数组并且不必担心广播:

%timeit particles.apply_lateral_wind(0.5, 1.2)
100 loops, best of 3: 3.17 ms per loop

而使用您的 numpy 示例给出

%timeit start_values[..., :2] += np.array([0.5, 1.2])
10 loops, best of 3: 21.1 ms per loop

关于python - 如何有效结合类设计和矩阵数学?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35399392/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com