首页 > 解决方案 > 如何枚举不包括第一行和最后一行和列的二维 NumPy 数组?

问题描述

我想枚举一个二维 NumPy 数组的元素,不包括第一行和最后一行和列(即下面矩阵中的元素)。

import numpy as np

q = np.zeros((4, 4))
q[1, 1] = 1
q[1, 2] = 1
q[2, 1] = 1
q[2, 2] = 1

# [[0. 0. 0. 0.]
#  [0. 1. 1. 0.]
#  [0. 1. 1. 0.]
#  [0. 0. 0. 0.]]

我可以使用枚举每个元素并将条件检查添加到第一行和最后一行/列,但这似乎很粗糙:

for ij, q_ij in np.ndenumerate(q):
    print(ij, q_ij)

当我切掉第一列和最后一列和行ij减少一个

for ij, q_ij in np.ndenumerate(q[1:-1, 1:-1]):
    i, j = ij
    original_ij = (i + 1, j + 1)
    print(original_ij, ij, q_ij)

# (1, 1) (0, 0) 1.0
# (1, 2) (0, 1) 1.0
# (2, 1) (1, 0) 1.0
# (2, 2) (1, 1) 1.0

我显然可以调整ij正确参考原始矩阵。为了清楚起见,我正在尝试计算标量场(例如温度)的拉普拉斯算子

laplacian[i][j] = q[i+1][j] + q[i-1][j] + q[i][j+1] + q[i][j-1] - 4*a[i][j]

并且需要避开边界元素。

有没有更优雅的方法来做到这一点?

标签: pythonnumpynumpy-ndarraynumpy-slicing

解决方案


我认为没有更多“优雅”的形式,真诚地,我将使用基本 range(1,q_ij-1)* ,但最终都是我们的编程方式,只需使用您更舒适且效果更好的形式即可

范围(开始,停止[,步骤])


推荐阅读