На данный момент это просто работает, когда большой массив 2d можно отлично нарезать в субмарины одинакового размера.
Код, гофрированный ломтиков
a ->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]])
в этом
block_array->
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]]])
p
анг q
определяют размер блока
Код
a = arange(24)
a = a.reshape((4,6))
m = a.shape[0] #image row size
n = a.shape[1] #image column size
p = 2 #block row size
q = 3 #block column size
block_array = []
previous_row = 0
for row_block in range(blocks_per_row):
previous_row = row_block * p
previous_column = 0
for column_block in range(blocks_per_column):
previous_column = column_block * q
block = a[previous_row:previous_row+p,previous_column:previous_column+q]
block_array.append(block)
block_array = array(block_array)
Не могли бы вы сделать его более общим, чтобы размеры блоков были переменными? (с условием, что блоки прекрасно вписываются в исходный массив) – TheMeaningfulEngineer
Спасибо за редактирование. Не могли бы вы объяснить причины, лежащие в основе алгоритма? – TheMeaningfulEngineer
Несколько месяцев назад был [еще один вопрос] (http://stackoverflow.com/a/13990648/190597), который привлек меня к идее использования 'reshape' и' swapaxes'. «H // nrows» имеет смысл, так как это объединяет строки первого блока. Также имеет смысл, что вам понадобятся 'nrows' и' ncols', которые будут частью формы. '-1' сообщает reshape, чтобы заполнить любое число, необходимое для того, чтобы сделать reshape действительной. Вооружившись формой решения, я просто пробовал вещи, пока не нашел формулу, которая работает. Извините, у меня нет более глубокого объяснения для вас. – unutbu