我有一个经过表示矩形格子的 numpy 数组,其中每个站点包含一个 1 或一个 0,代表两种不同的材料。我正在模拟穿过这个晶格的热流。这个想法是两个晶格位置之间的电导率取决于两个位置的材料。
为了求解热方程,我需要从中创建一个稀疏的矩阵, 其中每个行和列对应于我原始矩阵中的一个单元格,其中元素表示站点之间的热导率和在格子上。
我的问题是是否有一种有效的方法可以在 numpy. 目前我有嵌套的 Python 循环,它遍历每个元素并将相应的条目添加到,但对于大型晶格,这显然会变得相当慢。有没有办法使用 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()