如何选择 3D NumPy 数组的 2D 对角线

How to choose 2D diagonals of a 3D NumPy array

我定义一个数组为:

XRN =np.array([[[0,1,0,1,0,1,0,1,0,1],
    [0,1,1,0,0,1,0,1,0,1],
    [0,1,0,0,1,1,0,1,0,1],
    [0,1,0,1,0,0,1,1,0,1],],
    [[0,1,0,1,0,1,1,0,0,1],
    [0,1,0,1,0,1,0,1,1,0],
    [1,1,1,0,0,0,0,1,0,1],
    [0,1,0,1,0,0,1,1,0,1],],
    [[0,1,0,1,0,1,1,1,0,0],
    [0,1,0,1,1,1,0,1,0,0],
    [0,1,0,1,1,0,0,1,0,1],
    [0,1,0,1,0,0,1,1,0,1],]])
print(XRN.shape,XRN)
XRN_LEN = XRN.shape[1]

我可以获得内部矩阵的总和:

    XRN_UP = XRN.sum(axis=1)
    print("XRN_UP",XRN_UP.shape,XRN_UP)

XRN_UP (3, 10) [[0 4 1 2 1 3 1 4 0 4]
 [1 4 1 3 0 2 2 3 1 3]
 [0 4 0 4 2 2 2 4 0 2]]

我想得到所有具有相同形状的对角线的总和(3,10)

我测试了代码:

  RIGHT = [XRN.diagonal(i,axis1=0,axis2=1).sum(axis=1) for i in range(XRN_LEN)]
  np_RIGHT = np.array(RIGHT)
  print("np_RIGHT=",np_RIGHT.shape,np_RIGHT)

但是得到了

np_RIGHT= (4, 10) [[0 3 0 3 1 2 0 3 1 2]
 [1 3 2 1 0 1 1 3 0 3]
 [0 2 0 1 1 1 1 2 0 2]
 [0 1 0 1 0 0 1 1 0 1]]

我检查了轴 1 和轴 2 的所有值,但 从未得到形状 (3,10):我该怎么做?

axis1   axis2   shape
0       1       (4,10)
0       2       (4,4)
1       0       (4,10)
1       2       (4,3)
2       0       (4,4)
2       1       (4,3)

如果我没理解错的话,你想分别对三个元素上所有可能的对角线求和。如果是这种情况,那么您必须在 axis1=1axis2=2 上应用 np.diagonal。这样,您最终会得到每个元素的 10 对角线,然后将其加起来为每个元素的 10 值。有 3 个元素,因此结果形状为 (10, 3):

>>> np.array([XRN.diagonal(i, 1, 2).sum(1) for i in range(XRN.shape[-1])])
array([[2, 3, 2],
       [2, 1, 2],
       [1, 1, 2],
       [3, 2, 3],
       [2, 2, 2],
       [2, 2, 2],
       [2, 3, 3],
       [2, 2, 2],
       [1, 0, 0],
       [1, 1, 0]])