Python 如何枚举不包括第一行和最后一行和列的二维NumPy数组?

Python 如何枚举不包括第一行和最后一行和列的二维NumPy数组?,python,numpy,numpy-ndarray,numpy-slicing,Python,Numpy,Numpy Ndarray,Numpy Slicing,我想列举二维NumPy数组的元素,不包括第一行和最后一行和列(即下面矩阵中的元素) 我可以使用枚举每个元素,并在第一行和最后一行/列中添加条件检查,但这似乎很粗糙: for ij, q_ij in np.ndenumerate(q): print(ij, q_ij) 当我切掉第一列和最后一列时,I和j将被切掉一行 for ij, q_ij in np.ndenumerate(q[1:-1, 1:-1]): i, j = ij original_ij = (i + 1,

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

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

for ij, q_ij in np.ndenumerate(q):
    print(ij, q_ij)
当我切掉第一列和最后一列时,
I
j
将被切掉一行

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
我可以明显地调整
I
j
以正确参考原始矩阵。为了清晰起见,我试图计算标量场的拉普拉斯函数(例如温度)

并且需要避免边界元素

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

我认为再也没有“优雅”的形式了,真诚地说,我将使用基本范围(1,q_ij-1)*,但最终都是我们的编程方式,只需使用您更舒适且工作良好的形式即可

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

我认为再也没有“优雅”的形式了,真诚地说,我将使用基本范围(1,q_ij-1)*,但最终都是我们的编程方式,只需使用您更舒适且工作良好的形式即可


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

使用切片分配构造数组:

In [164]: arr = np.zeros((4,4),int)
In [165]: arr[1:3,1:3] = np.arange(1,5).reshape(2,2)
In [166]: arr
Out[166]: 
array([[0, 0, 0, 0],
       [0, 1, 2, 0],
       [0, 3, 4, 0],
       [0, 0, 0, 0]])
由于打印每个元素,因此所需索引上的双循环与
ndenumerate
(或“隐藏”索引的任何其他内容)一样好:

用坐标一个接一个地打印数组的元素没有什么优雅之处

编辑 可以像这样用切片重写(诽谤可能不正确)

我的目标是对基本差分计算进行2d扩展:

In [178]: x = np.array([1,0,3,2,0,1])
In [179]: x[1:] - x[:-1]
Out[179]: array([-1,  3, -1, -2,  1])
这就是
np.diff(x)

scipy.signal
中,有一个可能适用的
convolve
功能。我见过其他人使用它,但我自己没有


使用切片分配构造数组:

In [164]: arr = np.zeros((4,4),int)
In [165]: arr[1:3,1:3] = np.arange(1,5).reshape(2,2)
In [166]: arr
Out[166]: 
array([[0, 0, 0, 0],
       [0, 1, 2, 0],
       [0, 3, 4, 0],
       [0, 0, 0, 0]])
由于打印每个元素,因此所需索引上的双循环与
ndenumerate
(或“隐藏”索引的任何其他内容)一样好:

用坐标一个接一个地打印数组的元素没有什么优雅之处

编辑 可以像这样用切片重写(诽谤可能不正确)

我的目标是对基本差分计算进行2d扩展:

In [178]: x = np.array([1,0,3,2,0,1])
In [179]: x[1:] - x[:-1]
Out[179]: array([-1,  3, -1, -2,  1])
这就是
np.diff(x)

scipy.signal
中,有一个可能适用的
convolve
功能。我见过其他人使用它,但我自己没有


通过在阵列上循环,您试图实现的目标是什么。您最好使用numpy的非循环方法。不建议在numpy阵列上循环。也许你可以详细说明你更广泛的问题,这样我们可以更好地帮助你。感谢you@Ehsan我试图计算标量场的拉普拉斯函数
q
(编辑问题以澄清)。通过在数组上循环,您试图实现的是什么。您最好使用numpy的非循环方法。不建议在numpy阵列上循环。也许你可以详细说明你更广泛的问题,这样我们可以更好地帮助你。感谢you@Ehsan我试图计算标量场的拉普拉斯函数
q
(编辑问题以澄清)。我添加了更多的上下文,说明为什么我只需要非边界元素(计算标量场的拉普拉斯函数)。使用
np.arange
np.reformate
对非边界值进行切片的好技巧。我添加了一个
np.diff
示例。我添加了更多关于为什么只需要非边界元素(计算标量字段的拉普拉斯数)的上下文。使用
np.arange
np.reformate
我添加了一个
np.diff
示例,这是一个很好的在非边界值中切片的技巧。
q[i+1][j] + q[i-1][j] + q[i][j+1] + q[i][j-1] - 4*a[i][j]
q[2:4,1:3] - q[0:2,1:3] + ... - 4*a[1:3, 1:3]
In [178]: x = np.array([1,0,3,2,0,1])
In [179]: x[1:] - x[:-1]
Out[179]: array([-1,  3, -1, -2,  1])