我有一个3维numpy数组,我想访问它的短对角线元素。让我们说i,j,k是三个维度。是否可以访问i==j
或 i==k
或 j==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
答案 0 :(得分:2)
方法#1
我们可以使用覆盖输入数组维度的远程数组创建带有np.ix_
的开放网格,然后在与问题中描述的语法非常接近的语法之间执行OR运算,如下所示 - < / p>
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阵列的方法那样具有内存效率。