Как изменить этот массив так, как мне нужно? - PullRequest
3 голосов
/ 09 апреля 2019

Я хочу изменить массив из трех матриц 2x2, который имеет форму (3,2,2), то есть

a = np.array([[[a1,a2],[a3,a4]],
             [[b1,b2],[b3,b4]],
             [[c1,c2],[c3,c4]]])

, до этого массива формы (2,2,3):

[[[a1,b1,c1],[a2,b2,c2]],
 [[a3,b3,c3],[a4,b4,c4]]])

Обычный np.reshape(a, (2,2,3)) возвращает этот массив:

[[[a1, a2, a3],[a4, b1, b2]],
 [[b3, b4, c1],[c2, c3, c4]]]

и np.reshape(a, (2,2,3), order = 'F') приносит это:

[[[a1, b3, c2],[c1, a2, b4]],
 [[b1, c3, a4],[a3, b2, c4]]]

Как я могу изменить исходный массивчтобы получить то, что мне нужно?

Это для использования с matplotlib.pyplot.imshow, где три исходные матрицы соответствуют трем цветам 'RGB', и каждый из элементов является плавающей точкой в ​​диапазоне [0,1].Также, если есть лучший способ сделать это, я был бы рад узнать.

Ответы [ 2 ]

2 голосов
/ 09 апреля 2019

Нам просто нужно переставить оси. Два способа сделать это.

Использование np.transpose -

a.transpose(1,2,0) # a is input array
# or np.transpose(a,(1,2,0))

Мы также можем использовать np.moveaxis -

np.moveaxis(a,0,2)    # np.moveaxis(a, 0, -1)

Пробный прогон -

In [157]: np.random.seed(0)

In [158]: a = np.random.randint(11,99,(3,2,2))

In [159]: a
Out[159]: 
array([[[55, 58],
        [75, 78]],

       [[78, 20],
        [94, 32]],

       [[47, 98],
        [81, 23]]])

In [160]: a.transpose(1,2,0)
Out[160]: 
array([[[55, 78, 47],
        [58, 20, 98]],

       [[75, 94, 81],
        [78, 32, 23]]])
1 голос
/ 09 апреля 2019

То, что вы хотите, это транспонирование :

a = np.array([[['a1', 'a2'],['a3', 'a4']],
             [['b1', 'b2'],['b3', 'b4']],
             [['c1', 'c2'],['c3', 'c4']]])

print(np.rollaxis(a, 1, 3).T)

Выход:

[[['a1' 'b1' 'c1']
  ['a2' 'b2' 'c2']]

 [['a3' 'b3' 'c3']
  ['a4' 'b4' 'c4']]]
...