从 numpy 中的格子有效地创建邻接矩阵

计算科学 Python 麻木的
2021-12-07 14:11:46

我有一个n经过m表示矩形格子的 numpy 数组L,其中每个站点包含一个 1 或一个 0,代表两种不同的材料。我正在模拟穿过这个晶格的热流。这个想法是两个晶格位置之间的电导率取决于两个位置的材料。

为了求解热方程,我需要从中创建一个稀疏的nm×nm矩阵C, 其中每个nm行和列对应于我原始矩阵中的一个单元格,其中(i,j)th元素表示站点之间的热导率ij在格子上。

我的问题是是否有一种有效的方法可以在 numpy. 目前我有嵌套的 Python 循环,它遍历每个元素L并将相应的条目添加到C,但对于大型晶格,这显然会变得相当慢。有没有办法使用 numpy 原语而不是 Python 循环来做到这一点?

为清楚起见,我当前的代码如下所示:

A = sp.lil_matrix((w*h,w*h))

def coords_to_index(x, y):
    return x*h+y

def setlink(p1x, p1y, p2x, p2y):
    i = coords_to_index(p1x,p1y)
    j = coords_to_index(p2x,p2y)
    ci = grid[p1x,p1y]
    cj = grid[p2x,p2y]
    if ci==cj:
        d = 1
    else:
        d = 1e-3 # conductance is much smaller between different materials
    A[i,j] = d
    return d

for x in range(w):
    for y in range(h):
        d = 0.
        if x>0:
            d += setlink(x,y,x-1,y)
        else:
            d += 1
        if x<w-1:
            d += setlink(x,y,x+1,y)
        else:
            d += 1
        if y>0:
            d += setlink(x,y,x,y-1)
        else:
            d += 1
        if y<h-1:
            d += setlink(x,y,x,y+1)
        else:
            d += 1
        i = coords_to_index(x,y)
        A[i,i] = -d

A = A.tocsr()
0个回答
没有发现任何回复~