numpy对象数组
我正在尝试在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)
还将把grid [0,2] .a的值设置为5。这种行为是不需要的。为避免该问题,我可以遍历每个网格点并逐个元素地分配对象,例如
for i in range(3):
for j in range(3):
lattice[i,j] = site(a)
但是,是否有更好的方法(不涉及循环)将对象分配给多维数组?
谢谢
-
您可以向量化类的
__init__
功能:import numpy as np class Site: def __init__(self, a): self.a = a def set_a(self, new_a): self.a = new_a vSite = np.vectorize(Site) init_arry = np.arange(9).reshape((3,3)) lattice = np.empty((3,3), dtype=object) lattice[:,:] = vSite(init_arry)
这看起来更干净,但与循环解决方案相比没有性能优势。列表理解答案将创建一个中间python列表,这将导致性能下降。