如何将3D数组的元素变成上三角然后转置它

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

例如,我得到了下面的3D数组

[[[1,2,3],
[4,5,6]
[7,8,9]],

[[1,3,5],
[2,4,6],
[5,7,9]]

[[1,4,6],
[2,4,7],
[5,8,9]]
]

第一个问题是如何使第一个轴上的每个元素成为三角矩阵,即

[[[0,2,3],
[0,0,6]
[0,0,0]],

[[0,3,5],
[0,0,6],
[0,0,0]]

[[0,4,6],
[0,0,7],
[0,0,0]]
]

基于此,我怎样才能转置它们中的每一个,就像

[[[0,0,0],
[2,0,0]
[3,6,0]],

[[0,0,0],
[3,0,0],
[5,6,0]]

[[0,0,0],
[4,0,0],
[6,7,0]]
]
python python-3.x numpy numpy-ndarray numpy-ufunc
3个回答
3
投票

使用

np.triu
,然后沿最后两个轴交换轴以有效地进行转置 -

In [10]: np.triu(a,1).swapaxes(1,2)
Out[10]: 
array([[[0, 0, 0],
        [2, 0, 0],
        [3, 6, 0]],

       [[0, 0, 0],
        [3, 0, 0],
        [5, 6, 0]],

       [[0, 0, 0],
        [4, 0, 0],
        [6, 7, 0]]])

也可以通过

ndarray.transpose(0,2,1)
实现交换。


1
投票

您可以一次性完成两项任务(单循环):

for i in range(a.shape[0]):
    a[i,...] = np.triu(a[i,...], k=1).T

结果是:

array([[[0, 0, 0],
        [2, 0, 0],
        [3, 6, 0]],

       [[0, 0, 0],
        [3, 0, 0],
        [5, 6, 0]],

       [[0, 0, 0],
        [4, 0, 0],
        [6, 7, 0]]])

0
投票
import numpy as np

# Example usage:
x = np.array([[[1,2,3],
              [4,5,6],
              [7,8,9]],

             [[1,3,5],
              [2,4,6],
              [5,7,9]],

             [[1,4,6],
              [2,4,7],
              [5,8,9]]])

upper_triu = np.triu(x,k=0)
print(upper_triu)
'''
[[[1 2 3]
  [0 5 6]
  [0 0 9]]

 [[1 3 5]
  [0 4 6]
  [0 0 9]]

 [[1 4 6]
  [0 4 7]
  [0 0 9]]]
'''
res = np.transpose(upper_triu,axes = (0,2,1))
print(res)
'''
[[[1 0 0]
  [2 5 0]
  [3 6 9]]

 [[1 0 0]
  [3 4 0]
  [5 6 9]]

 [[1 0 0]
  [4 4 0]
  [6 7 9]]]

'''
© www.soinside.com 2019 - 2024. All rights reserved.