Hiện tại, nó chỉ hoạt động khi mảng 2d lớn có thể được cắt hoàn toàn thành các mảng con có kích thước bằng nhau.
Mã dưới lát
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]])
vào này
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
xác định kích thước khối
Mã
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)
Bạn có thể làm cho nó chung chung hơn, do đó kích thước khối là các biến? (với điều kiện chặn hoàn toàn phù hợp trong mảng ban đầu) – TheMeaningfulEngineer
Cảm ơn bạn đã chỉnh sửa. Bạn có thể giải thích lý do đằng sau thuật toán không? – TheMeaningfulEngineer
Đã có [một câu hỏi khác] (http://stackoverflow.com/a/13990648/190597) một vài tháng trước đây đã đưa tôi vào ý tưởng sử dụng 'reshape' và' swapaxes'. 'H // nrows' có ý nghĩa vì nó giữ các hàng của khối đầu tiên với nhau. Nó cũng có nghĩa là bạn sẽ cần 'nrows' và' ncols' để trở thành một phần của hình dạng. '-1' cho biết định dạng lại để điền vào bất kỳ số nào là cần thiết để làm cho định dạng lại hợp lệ. Được trang bị các hình thức của giải pháp, tôi chỉ thử những thứ cho đến khi tôi tìm thấy công thức hoạt động. Tôi xin lỗi tôi không có một lời giải thích sâu sắc hơn cho bạn. – unutbu