Как превратить элемент 3D массива в верхний треугольник angular и затем переставить его - PullRequest
2 голосов
/ 09 июля 2020

Например, я получил 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]]
]

Первый вопрос заключается в том, как я могу сделать каждый элемент вдоль первой оси матрицей tri angular, т.е.

[[[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]]
]

Ответы [ 2 ]

1 голос
/ 09 июля 2020

Вы можете выполнить обе задачи за один go (один l oop):

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]]])
1 голос
/ 09 июля 2020

Используйте 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).

...