我正在尝试在Python中实现格子模型(格子boltzmann)的模拟.格子的每个站点都具有许多属性,并根据某些规则与相邻站点交互.我认为创建一个包含所有属性的类并创建该类的实例网格可能很聪明.(由于我对Python缺乏经验,这可能不是一个好主意,所以请随意评论我的方法.)
这是我正在做的一个玩具示例
class site:
def __init__(self,a,...):
self.a = a
.... other properties ...
def set_a(self, new_a):
self.a = new_a
Run Code Online (Sandbox Code Playgroud)
现在我想处理这些站点的2D/3D点阵(网格),所以我尝试执行以下操作(这里以2D 3x3网格为例,但在模拟中我需要> 1000x1000X1000的顺序)
lattice = np.empty( (3,3), dtype=object)
lattice[:,:] = site(3)
Run Code Online (Sandbox Code Playgroud)
现在,问题是例如每个格点指的是同一个实例
lattice[0,0].set_a(5)
Run Code Online (Sandbox Code Playgroud)
还会将lattice [0,2] .a的值设置为5.此行为是不需要的.为了避免这个问题,我可以遍历每个网格点并按元素分配对象,比如
for i in range(3):
for j in range(3):
lattice[i,j] = site(a)
Run Code Online (Sandbox Code Playgroud)
但是有没有更好的方法(不涉及循环)将对象分配给多维数组?
谢谢
我有一个多维对象数组,例如:
a = np.array([obj1,obj2,obj3])
Run Code Online (Sandbox Code Playgroud)
对象是具有多个属性的类的实例。假设其中之一是高度,其中之一是长度。要获得相应的多维长度和高度数组,我执行以下操作:
lengths = np.array([obj1.length,obj2.length,obj3.length])
heights = np.array([obj1.height,obj2.height,obj3.height])
Run Code Online (Sandbox Code Playgroud)
这开始使我的代码混乱很多。有没有更有效的方法来做到这一点?例如,我有类似的东西
heights = a.height
Run Code Online (Sandbox Code Playgroud)
记住,但显然它不起作用,因为 a 是我的对象而不是我的对象的数组。但是有没有类似的东西我可以做,既高效又pythonic?我试过类似的东西
for x in np.nditer(a,flags=['refs_ok']):
print x.length
Run Code Online (Sandbox Code Playgroud)
看看会发生什么,但它不起作用,因为 nditer 以某种方式返回一个元组。
有任何想法吗?