визуальное понимание вращения с помощью numpy.rot90 для массивов 3D и более высоких порядков, ndarrays размером больше 3 - PullRequest
0 голосов
/ 02 мая 2019

Я пытаюсь понять один поворот на 90 градусов трехмерного массива и мне очень трудно его визуализировать (и, следовательно, понять сам процесс вращения).

Для двумерного случая это легко сделать. В качестве примера рассмотрим приведенный ниже фрагмент кода, который выполняет поворот на 90 градусов против часовой стрелки к двумерному массиву:

In [222]: m = np.arange(6).reshape((2,3))

In [223]: m
Out[223]: 
array([[0, 1, 2],
       [3, 4, 5]])

90 ° преобразование для двумерного массива

      <--------\
array([[0, 1, 2],\   # anti-clockwise
       [3, 4, 5]])\  # rotation
                   \
           ||

In [224]: np.rot90(m)
Out[224]: 
array([[2, 5],
       [1, 4],
       [0, 3]])

Но вещи становятся сложнее для трехмерных и многомерных массивов. Опять же, в качестве примера, давайте рассмотрим простой трехмерный массив:

In [219]: m = np.arange(12).reshape((2,2,3))

In [220]: m
Out[220]: 
array([[[ 0,  1,  2],
        [ 3,  4,  5]],

       [[ 6,  7,  8],
        [ 9, 10, 11]]])

In [221]: np.rot90(m)
Out[221]: 
array([[[ 3,  4,  5],
        [ 9, 10, 11]],

       [[ 0,  1,  2],
        [ 6,  7,  8]]])

Глядя на вышеприведенный вывод, я не мог понять, как вращение влияет на массив. Есть ли оптимизированный процесс, чтобы понять такую ​​трансформацию? Я также посмотрел на форму, и она почти такая же, что делает ее еще более трудной для понимания.

In [227]: np.rot90(m).shape
Out[227]: (2, 2, 3)

Я особенно заинтересован в понимании этого преобразования, так как оно всегда возвращает новый " view " исходного буфера массива, который был бы очень полезен для написания кода исполнения как с точки зрения памяти и времени. Пожалуйста, поделитесь, если у вас есть какие-либо мысли по этому поводу!

1 Ответ

1 голос
/ 02 мая 2019

Выражение вашего 2-го случая в терминах транспонирования и отражения:

In [182]: m = np.arange(6).reshape((2,3))                                            

In [183]: m                                                                          
Out[183]: 
array([[0, 1, 2],
       [3, 4, 5]])

In [184]: m.transpose(1,0)                                                           
Out[184]: 
array([[0, 3],
       [1, 4],
       [2, 5]])

In [185]: m.transpose(1,0)[::-1, :]                                                  
Out[185]: 
array([[2, 5],
       [1, 4],
       [0, 3]])

В 3-м случае это похоже на то же самое - с 3-й осью, помеченной вдоль:

In [188]: m.transpose(1,0,2)[::-1, :]                                                
Out[188]: 
array([[[ 3,  4,  5],
        [ 9, 10, 11]],

       [[ 0,  1,  2],
        [ 6,  7,  8]]])

Если я укажу 2-ю пару осей, она делает то же самое, но с 1-й парой, идущей вместе для поездки:

In [189]: np.rot90(m, axes=(1,2))                                                    
Out[189]: 
array([[[ 2,  5],
        [ 1,  4],
        [ 0,  3]],

       [[ 8, 11],
        [ 7, 10],
        [ 6,  9]]])

In [190]: _.shape                                                                    
Out[190]: (2, 3, 2)

In [191]: m.transpose(0,2,1)[:,::-1, :]                                              
Out[191]: 
array([[[ 2,  5],
        [ 1,  4],
        [ 0,  3]],

       [[ 8, 11],
        [ 7, 10],
        [ 6,  9]]])

Разные k требуют разных стратегий.Например, со ставкой 2, я ставлю, что она просто переворачивает.

===

Дисплей Out[188] не помогает нам визуализировать вращение, поскольку включает плоскости 1-го измерения и 2-го измеренияразмерные ряды.Но если мы выберем столбец 3-го измерения и сравним оригинал и вращение, мы увидим одно и то же 2-мерное вращение:

In [192]: m[:,:,0]                                                                   
Out[192]: 
array([[0, 3],
       [6, 9]])

In [193]: Out[188][:,:,0]                                                            
Out[193]: 
array([[3, 9],
       [0, 6]])

3D-массив не всегда представляет собой трехмерную прямоугольную призму.Вместо этого это может быть двухмерное изображение с 3 цветными каналами.Это вращение m поворачивает изображение без изменения цветов.По умолчанию отображение «плоскость / строка / столбец» не помогает нам визуализировать такое изображение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...