Na razie działa to tylko wtedy, gdy duża tablica 2d może być idealnie pokrojona na podobszary o podobnej wielkości.
Kodeksu mieszkowe plastry
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]])
do tego
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
ang q
określenia rozmiaru bloku
kod
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)
Czy można uczynić go bardziej ogólnym, aby rozmiary bloków były zmienne? (pod warunkiem, że bloki idealnie pasują do oryginalnej tablicy) – TheMeaningfulEngineer
Dzięki za edycję. Czy mógłbyś wyjaśnić przyczyny algorytmu? – TheMeaningfulEngineer
Kilka miesięcy temu [jeszcze jedno pytanie] (http://stackoverflow.com/a/13990648/190597) wpadło mi na pomysł użycia 'reshape' i' swapaxes'. 'H // nrows' ma sens, ponieważ utrzymuje on razem wiersze pierwszego bloku. Ma również sens, że będziesz potrzebować 'nrows' i' ncols' jako części kształtu. '-1' mówi, że zmiana kształtu wymaga podania liczby, która jest konieczna do zmiany kształtu. Uzbrojony w formę rozwiązania, po prostu próbowałem rzeczy, dopóki nie znalazłem formuły, która działa. Przepraszam, że nie mam dla ciebie bardziej wnikliwego wyjaśnienia. – unutbu