如何获得numpy 3-D阵列的对角线分量?

问题描述 投票:0回答:2

我有一个三维数组

a = np.array(
    [[[1, 2],
      [3, 4]],

     [[5, 6],
      [7, 8]]]
)

我想从这个数组得到对角线分量,我的意思是,

>> np.array([a[i,i,:] for i in range(min(a.shape[0], a.shape[1]))])
array([[1, 2],
       [7, 8]])

有没有比上面更快的方法?

python-3.x numpy scipy diagonal
2个回答
1
投票

而不是np.diagonal你也可以使用np.einsum

>>> a = np.arange(1,9).reshape(2,2,2)
>>> d = np.einsum('iij->ij', a)
>>> d
array([[1, 2],
       [7, 8]])

优点:它返回一个可写视图,因此可以用来直接操作原始数组中的对角线:

>>> d[0,0] = -3
>>> a
array([[[-3,  2],
        [ 3,  4]],

       [[ 5,  6],
        [ 7,  8]]])

1
投票

np.diagonal适用于具有两个以上维度的数组,您可以使用参数axis1axis2指定要查看的轴,对于您的情况,默认值(axis1 = 0,axis2 = 1)有效:

np.diagonal(a, axis1=0, axis2=1).T
# array([[1, 2],
#        [7, 8]])

它也适用于在两个轴上具有不同大小的数组:

a = np.array(
    [[[1, 2],
      [3, 4]],
​
     [[5, 6],
      [7, 8]],

     [[9, 10],
      [11, 12]]]
)
​
np.diagonal(a).T
#array([[1, 2],
#       [7, 8]])

a = np.array(
    [[[1, 2],
      [3, 4],
      [9, 10]],
​
     [[5, 6],
      [7, 8],
      [11, 12]]]
)
​
np.diagonal(a).T
#array([[1, 2],
#       [7, 8]])

或者你可以使用advanced indexing

创建范围索引:

idx = np.arange(min(a.shape[:2]))

idx
# array([0, 1])

使用整数数组索引第一维和第二维,使用切片索引第三维:

a[idx, idx, :]
#array([[1, 2],
#       [7, 8]])
© www.soinside.com 2019 - 2024. All rights reserved.