numpy对象数组

发布于 2021-01-29 17:05:24

我正在尝试在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)

但是,是否有更好的方法(不涉及循环)将对象分配给多维数组?

谢谢

关注者
0
被浏览
44
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    您可以向量化类的__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列表,这将导致性能下降。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看