numpy 仅当在界限内时才对数字数组进行索引

7lrncoxx  于 2022-11-10  发布在  其他
关注(0)|答案(2)|浏览(102)

我有一个二维数值数组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,那么它可能会起作用。当然,如果有一种更省时的方法,那就更好了。

ljo96ir5

ljo96ir51#

这个问题看起来像是有限差分。最好的办法是为内点编写一个(快速的,可能是递归的)循环,然后分别在边界点上循环,在边界点上施加所需的边界条件。显然,另一种方法也是可行的:首先指定边界点,然后循环内部点。
也就是说,如果您在速度方面有问题(可能是因为您的网格非常庞大),您可能需要进行一些优化,因为在Python中的2D数组是S L O W:

  • 尝试颠倒循环顺序:在python中(NumPy,如果您正在使用它),首先按行遍历2D数组。你至少可以试一试这一点。
  • 试着将你的2D事物分配为一个大的1D块,其中它的唯一索引是n = i + nx * j,而i,j是原始的2D索引。再次尝试在行和列之间先运行新的索引n。

这两个建议结合在一起应该会给您带来巨大的加速比。

iaqfqrcu

iaqfqrcu2#

我已经意识到,使用NumPy数组操作绝对是使代码更快的方法。将其与np.pad配对以将零添加到矩阵的边缘使得这一点变得相当简单。

相关问题