访问 Numpy 3 维数组中的短对角线元素

Access to short diagonal elements in Numpy 3 dimensional array

我有一个 3 维 numpy 数组,我想访问它的短对角线元素。假设 i,j,k 是三个维度。是否可以访问 i==j ori==korj==k 的元素,以便我可以设置他们到一个特定的价值。

我试图通过创建一个索引掩码变量来解决这个问题。这个索引的掩码变量被馈送到最终数组,其中 {i=j or i=k or j=k} 的值被设置为特定值。不幸的是,此代码返回 {i=j=k}

的集合
import numpy as np

N = 3

maskXY = np.eye(N).reshape(N,N,1)

maskYZ = np.eye(N).reshape(1,N,N)

maskXZ = np.eye(N).reshape(N,1,N)

maskIndices = maskXY * maskYZ*maskXZ

#set the values of final array using above mask

finalArray[maskIndices] = #specific values

方法 #1

我们可以使用覆盖输入数组维度的范围数组使用 np.ix_ 创建开放网格,然后在与问题中描述的语法非常接近的那些中执行 OR-ing,像这样 -

i,j,k = np.ix_(*[np.arange(r) for r in finalArray.shape])
mask = (i==j) | (i==k) | (j==k)
finalArray[mask] = # desired values

方法 #2

看来,我们也可以按照问题中发布的代码使用掩码的布尔版本,然后执行 OR-ing 以获得 mask 等价物,就像这样 -

mask = (maskXY==1) | (maskYZ==1) | (maskXZ==1)

但是,这涉及到 2D(压缩时)的蒙版,因此不会像以前处理 1D 数组的方法那样memory-efficient。