我有一个二维数值数组psi
,形状为(nx,ny)
。我想创建一个形状相同的新数组phi
,其中对于每个元素phi[i][j]
,我需要计算一个包含psi[i][j]
和相邻元素psi[i-1][j]
、psi[i+1][j]
、psi[i][j+1]
和psi[i][j-1]
的表达式,除了这些相邻元素中的任何一个不在psi
的边界内的边缘情况外,将该元素视为表达式中的0
。
我可以使用嵌套的for循环和检查边界条件来实现这一点,但我希望尽可能地节省时间来执行此操作。我试过通过分配phi[1:-1,1:-1] = f(psi[1:-1,1:-1], psi[0:-2,1:-1], psi[2:,1:-1], psi[1:-1,0:-2], psi[1:-1,2:])
但这不包括变得混乱的边缘情况,所以如果有一些有条件的方法在其他范围内只引用0
,那么它可能会起作用。当然,如果有一种更省时的方法,那就更好了。
2条答案
按热度按时间ljo96ir51#
这个问题看起来像是有限差分。最好的办法是为内点编写一个(快速的,可能是递归的)循环,然后分别在边界点上循环,在边界点上施加所需的边界条件。显然,另一种方法也是可行的:首先指定边界点,然后循环内部点。
也就是说,如果您在速度方面有问题(可能是因为您的网格非常庞大),您可能需要进行一些优化,因为在Python中的2D数组是S L O W:
n = i + nx * j
,而i,j
是原始的2D索引。再次尝试在行和列之间先运行新的索引n。这两个建议结合在一起应该会给您带来巨大的加速比。
iaqfqrcu2#
我已经意识到,使用NumPy数组操作绝对是使代码更快的方法。将其与np.pad配对以将零添加到矩阵的边缘使得这一点变得相当简单。