Нахождение максимальных значений из заданных подмассивов с использованием шагов numpy - PullRequest
0 голосов
/ 08 марта 2020

Мне дан такой 2D-массив.

enter image description here

Моя задача - найти максимальные значения в подмассивах, окрашенных разными цветами. Я должен использовать шаги и as_strided. Пока мой код выглядел так:

a=np.vstack(([0,1,2,3,4,5],[6,7,8,9,10,11],[12,13,14,15,16,17],[18,19,20,21,22,23]))
print(np.max(np.lib.stride_tricks.as_strided(a,(2,3),strides=(24,4))))

Он правильно показывает максимальное значение первого блока, равное 8, но я понятия не имею, как я могу перейти к другим частям матрицы. Есть ли способ, которым я мог бы перейти к другим частям матрицы, чтобы я мог показать максимальное значение подмассива?

ПРИМЕЧАНИЕ: эта задача от моих вводных классов до python программирования, так что нет необходимости писать любые сложные функции, я бы даже сказал, что это нецелесообразно

Ответы [ 2 ]

1 голос
/ 08 марта 2020
In [297]: a = np.arange(24).reshape(4,6)                                                       
In [298]: a                                                                                    
Out[298]: 
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]])

Если мы изменим размер 4 от dim до (2,2), а от 6 до (2,3):

In [299]: a.reshape(2,2,2,3)                                                                   
Out[299]: 
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 [300]: a.reshape(2,2,2,3).transpose(0,2,1,3)                                                
Out[300]: 
array([[[[ 0,  1,  2],
         [ 6,  7,  8]],

        [[ 3,  4,  5],
         [ 9, 10, 11]]],


       [[[12, 13, 14],
         [18, 19, 20]],

        [[15, 16, 17],
         [21, 22, 23]]]])

и получить максимум каждого из 2-х внутренних блоков:

In [301]: a.reshape(2,2,2,3).transpose(0,2,1,3).max((2,3))                                     
Out[301]: 
array([[ 8, 11],
       [20, 23]])

a.reshape(2,2,2,3).max((1,3)) получает тот же максимум.

Хорошо, это не было сделано с strides, но это дает мне представление о том, как использовать шаги.

шагов самого a:

In [303]: a.strides                                                                            
Out[303]: (48, 8)

после изменения формы:

In [304]: a.reshape(2,2,2,3).strides                                                           
Out[304]: (96, 48, 24, 8)

и после транспонирования:

In [305]: a.reshape(2,2,2,3).transpose(0,2,1,3).strides                                        
Out[305]: (96, 24, 48, 8)

Так что мы можем использовать эти шаги напрямую:

In [313]: np.lib.stride_tricks.as_strided(a,(2,2,2,3),(96,24,48,8))                            
Out[313]: 
array([[[[ 0,  1,  2],
         [ 6,  7,  8]],

        [[ 3,  4,  5],
         [ 9, 10, 11]]],


       [[[12, 13, 14],
         [18, 19, 20]],

        [[15, 16, 17],
         [21, 22, 23]]]])
0 голосов
/ 10 марта 2020
import numpy as np

from numpy.lib.stride_tricks import as_strided

matrix = np.arange(24).reshape(4, 6)

maxtrix = np.array([as_strided(matrix[0], (2, 3), matrix.strides).max(),
                    as_strided(matrix[0][3:6], (2, 3), matrix.strides).max(),
                    as_strided(matrix[2], (2, 3), matrix.strides).max(),
                    as_strided(matrix[2][3:6], (2, 3), matrix.strides).max()
                    ]).reshape(2, 2)
...