【发布时间】:2011-06-20 03:24:50
【问题描述】:
我正在尝试在 Python 中实现晶格模型 (lattice boltzmann) 的模拟。格子的每个站点都有许多属性,并按照一定的规则与相邻站点交互。我认为创建一个具有所有属性的类并制作该类的实例网格可能是聪明的。 (由于我对 Python 没有经验,这可能根本不是一个好主意,所以请随时评论我的方法。)
这是我正在做的一个玩具示例
class site:
def __init__(self,a,...):
self.a = a
.... other properties ...
def set_a(self, new_a):
self.a = new_a
现在我想处理此类站点的 2D/3D 点阵(网格),因此我尝试执行以下操作(这里以 2D 3x3 网格为例,但在模拟中我需要 >1000x1000X1000 的顺序)
lattice = np.empty( (3,3), dtype=object)
lattice[:,:] = site(3)
现在,问题是每个格点都指向同一个实例,例如
lattice[0,0].set_a(5)
还将 lattice[0,2].a 的值设置为 5。这种行为是不受欢迎的。为了避免这个问题,我可以遍历每个网格点并逐个元素地分配对象,比如
for i in range(3):
for j in range(3):
lattice[i,j] = site(a)
但是有没有更好的方法(不涉及循环)将对象分配给多维数组?
谢谢
【问题讨论】:
-
如果您要处理 >1000x1000X1000 数组,不要使用对象数组!!与使用“普通”numpy 数组相比,它将使用大量内存。对象数组不是你想要的......
-
通过模拟我猜你的意思是流体模拟?如果是这样,那么我建议您重新考虑您的方法。也许你的数组元素应该是数字元素,所以你可以利用线性代数的所有力量;-)。粒子传播和碰撞过程必须在全局范围内完成!没有本地对象格能够在任何合理的计算时间内处理它。只是toughts,不知道你的目标是什么;-)。谢谢
-
@eat:我在做流体模拟。我想编写一个通用的站点网格,其中所有本地属性都收集在一个类中(在我的书中碰撞是本地的,而不是传播),但我想你毕竟是对的。至少 bpowah 教会了我如何向量化 init 函数:)
-
顺便问一下,你见过旗鱼吗? sailfish.us.edu.pl/index.html 这是一个 GPU 加速流体模拟包,使用 numpy 和 pyopencl/pycuda 实现的 Lattice-Boltzman 方法。从我所看到的(这只是演示视频......)来看,它非常漂亮。无论如何,认为您可能会发现它相关。
-
@Joe:谢谢!我去看看。
标签: python numpy simulation