【问题标题】:How to choose 2D diagonals of a 3D NumPy array如何选择 3D NumPy 数组的 2D 对角线
【发布时间】:2021-09-13 14:59:44
【问题描述】:

我将一个数组定义为:

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)

【问题讨论】:

  • XRN 是 (3,4,10) 形状; XRN_LEN 是 4,所以 RIGHT 有 len 4。你的 diagonal 是 (10,n),n 随着 i 从 3 到 1 变化。最后一个轴上的总和给我们留下 1d (10 ,) 大批。这就解释了 (4,10) 形状。 3d 数组上的对角线很难理解,尤其是当尺寸不同时。

标签: numpy sum axis shapes diagonal


【解决方案1】:

如果我理解正确,您想分别对三个元素上所有可能的对角线求和。如果是这种情况,那么您必须在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]])

【讨论】:

  • 感谢 Ivan,我没有注意到我的 XRN_LEN 错误,它必须是 XRN_LEN = XRN.shape[-1]。
猜你喜欢
  • 1970-01-01
  • 2018-08-10
  • 2023-01-24
  • 2021-05-11
  • 2012-12-09
  • 2011-11-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多