2017-01-23 7 views
1

У меня есть матрица 8x8 следующим образом:NumPy Array Reshaped, но как изменить ось для объединения?

[[ 0.3 0.3 0.3 0.3 0.3 0.5 0.1 -0.1] 
[ 0.1 0.1 -0.1 0.3 0.3 -0.1 -0.1 -0.5] 
[-0.1 0.1 0.3 -0.1 0.3 -0.1 -0.1 -0.1] 
[-0.1 0.1 0.5 0.3 -0.3 -0.1 -0.3 -0.1] 
[ 0.5 0.1 -0.1 0.1 -0.1 -0.1 -0.3 -0.5] 
[ 0.1 -0.1 -0.3 -0.5 -0.5 -0.1 -0.1 -0.3] 
[-0.5 -0.3 -0.3 -0.3 -0.1 -0.5 -0.1 -0.3] 
[-0.3 -0.3 -0.3 -0.3 -0.1 -0.1 -0.5 -0.3]] 

Мое окно 2х2. То, что я пытаюсь сделать, - собрать четыре числа (вверх и вниз) для объединения. Пример вывода выглядит следующим образом:

[[0.3 0.3 
     0.1 0.1] 

     [0.3 0.3 
     -0.1 0.3] 
     ....... 
     ....... 
     [-0.1 -0.3 
     -0.5 -0.3]] 

Что я использую это print arr.reshape(16,2,2) Что я не могу понять, как установить ось для этого требования. Мой выход:

[[[ 0.3 0.3] 
    [ 0.3 0.3]] 

[[ 0.3 0.1] 
    [ 0.5 -0.1]] 

[[ 0.1 -0.1] 
    [ 0.1 0.3]] 

[[ 0.3 -0.1] 
    [-0.1 -0.5]] 

[[-0.1 0.3] 
    [ 0.1 -0.1]] 

[[ 0.3 -0.1] 
    [-0.1 -0.1]] 

[[-0.1 0.5] 
    [ 0.1 0.3]] 

[[-0.3 -0.3] 
    [-0.1 -0.1]] 

[[ 0.5 -0.1] 
    [ 0.1 0.1]] 

[[-0.1 -0.3] 
    [-0.1 -0.5]] 

[[ 0.1 -0.3] 
    [-0.1 -0.5]] 

[[-0.5 -0.1] 
    [-0.1 -0.3]] 

[[-0.5 -0.3] 
    [-0.3 -0.3]] 

[[-0.1 -0.1] 
    [-0.5 -0.3]] 

[[-0.3 -0.3] 
    [-0.3 -0.3]] 

[[-0.1 -0.5] 
    [-0.1 -0.3]]] 

Пожалуйста, объясните, как применить ось к этому типу ситуации. Или, если их лучший способ получить максимальный пул, упомяните.

Примечание: все это для максимального объединения. Я использую NumPy, SciPy на python.

ответ

1

Резолюция, разделяющая каждую из двух осей на две части, так что последняя из разделенных осей имеет ту же длину, что и размер блока. Это даст нам массив 4D. Затем выполните максимальный поиск по этим последним осям, который будет второй и четвертой осями в массиве 4D.

Таким образом, просто сделать -

m,n = a.shape 
out = a.reshape(m//2,2,n//2,2).max(axis=(1,3)) 

Sample пробег -

In [50]: a 
Out[50]: 
array([[87, 96, 46, 97, 25, 22, 13, 16], 
     [65, 62, 68, 87, 52, 80, 26, 82], 
     [27, 82, 50, 20, 11, 14, 94, 23], 
     [86, 44, 17, 97, 17, 57, 76, 42], 
     [47, 85, 30, 61, 55, 87, 11, 35], 
     [36, 11, 29, 45, 16, 54, 40, 77], 
     [38, 87, 94, 77, 53, 20, 46, 18], 
     [86, 50, 17, 23, 91, 23, 25, 11]]) 

In [51]: m,n = a.shape 

In [52]: a.reshape(m//2,2,n//2,2).max(axis=(1,3)) 
Out[52]: 
array([[96, 97, 80, 82], 
     [86, 97, 57, 94], 
     [85, 61, 87, 77], 
     [87, 94, 91, 46]]) 
+0

Благодарим вас за ответ. Это проще и понятнее. Еще раз спасибо. –

3

ли

arr.reshape((4, 2, 4, 2)).transpose((0, 2, 1, 3)).reshape((16, 2, 2)) 

делать то, что вы хотите?

Редактирование: Немного объяснения: первая переменная разрезает оси x и y каждый на 4 блока из 2. Это почти то, о чем вы просили, только блоки находятся на оси 1 и 3, а не на последние два. В это место входит транспонирование. Это простое обобщение матрицы, транспонированной в математике (которая меняет оси 0 и 1) на произвольные размеры. Аргумент (0, 2, 1, 3) просит его оставить 0-ю и последнюю ось на месте и обменивать оси 1 и 2.

В этот момент форма (4, 4, 2, 2). Таким образом, окончательная реформация выравнивает первые две оси. Если вы можете вместо этого жить с 4 x 4 блоками по 2 x 2, то на самом деле целесообразно не выполнять вторую перестановку, потому что по сравнению с первыми двумя операциями она является дорогостоящей.

Это связано с тем, что транспонирование создает несмежный массив. Теперь одно отличие между непрерывными и несмежными массивами состоит в том, что перестройка смежных массивов стоит почти ничего, в то время как изменение несмежного массива обычно приводит к копированию.

+0

делает работу форматирования, но делает вытягивать максимум более сложным и трудно иметь дело с. Спасибо, что ответ был действительно полезен. –

 Смежные вопросы

  • Нет связанных вопросов^_^