Как поменять местами строки и столбцы массива numpy, не влияя на каналы? (Python 3.9)

#python #arrays #numpy

Вопрос:

У меня есть массив numpy со следующей структурой:

 A = [[(0, 0, 0), (0, 0, 0)],
     [(0, 0, 0), (0, 0, 0)],
     [(0, 0, 0), (0, 0, 0)],
     [(0, 0, 0), (0, 0, 0)]]
 

A имеет 4 строки, 2 колла и 3 канала (в кортежах). Для краткости: A.shape = (4, 2, 3)

Теперь мне нужно поменять местами строки и столбцы, не затрагивая каналы. Результат должен выглядеть следующим образом:

 B = [[(0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0)],
     [(0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0)]]
 

B имеет 2 строки, 4 колла и 3 канала (кортежи). Для краткости: B.shape = (2, 4, 3)

Лучшее, что я нашел за несколько часов, было таково: numpy.array(A).transpose() он работал для 1 изображения, но у других внезапно появилось 480 каналов XD ( A это упрощенная версия того, что у меня есть) и всего 3 строки.

Так как же мне это сделать?

Комментарии:

1. Посмотрите на метод reshape numpy : например np.array(A).reshape(dim1, dim2, dim3)

2. Транспонирование принимает параметр порядка, например A.transpose(1,0,2) , переключит первые 2 измерения, оставив последние, каналы, последними.

Ответ №1:

Одним из многих возможных методов является использование swapaxes метода:

 In [15]: A = np.arange(24).reshape(2, 4, 3)

In [16]: A
Out[16]: 
array([[[ 0,  1,  2],
        [ 3,  4,  5],
        [ 6,  7,  8],
        [ 9, 10, 11]],

       [[12, 13, 14],
        [15, 16, 17],
        [18, 19, 20],
        [21, 22, 23]]])

In [17]: A.shape
Out[17]: (2, 4, 3)

In [18]: B = A.swapaxes(0, 1)

In [19]: B.shape
Out[19]: (4, 2, 3)

In [20]: B
Out[20]: 
array([[[ 0,  1,  2],
        [12, 13, 14]],

       [[ 3,  4,  5],
        [15, 16, 17]],

       [[ 6,  7,  8],
        [18, 19, 20]],

       [[ 9, 10, 11],
        [21, 22, 23]]])
 

Комментарии:

1. Спасибо! Метод swapaxes(0, 1) работает!

Ответ №2:

Другой метод, помимо np.swapaxes использования np.transpose

Ознакомьтесь с документацией по транспонированию и заменам с основными примерами

 A = [[(0, 0, 0), (0, 0, 0)],
     [(0, 0, 0), (0, 0, 0)],
     [(0, 0, 0), (0, 0, 0)],
     [(0, 0, 0), (0, 0, 0)]]

A = np.array(A)

C = np.transpose(A, (1, 0, 2)) # axes1 and axes2 are switching here which changes the shape from (4,2,3) to (2,4,3)

print(C)
 

Выход :

 [[[0 0 0]
  [0 0 0]
  [0 0 0]
  [0 0 0]]

 [[0 0 0]
  [0 0 0]
  [0 0 0]
  [0 0 0]]]