Nếu kích thước hình ảnh là chia hết cho kernal kích thước, bạn có thể định hình lại mảng và sử dụng max
hoặc mean
như bạn thấy phù hợp
import numpy as np
mat = np.array([[ 20, 200, -5, 23],
[ -13, 134, 119, 100],
[ 120, 32, 49, 25],
[-120, 12, 9, 23]])
M, N = mat.shape
K = 2
L = 2
MK = M // K
NL = N // L
print(mat[:MK*K, :NL*L].reshape(MK, K, NL, L).max(axis=(1, 3)))
# [[200, 119], [120, 49]]
Nếu bạn không có số hạt nhân, bạn sẽ phải xử lý các ranh giới riêng biệt. (Như đã chỉ ra trong các ý kiến, kết quả này trong ma trận được sao chép, mà sẽ ảnh hưởng đến hiệu suất).
mat = np.array([[20, 200, -5, 23, 7],
[-13, 134, 119, 100, 8],
[120, 32, 49, 25, 12],
[-120, 12, 9, 23, 15],
[-57, 84, 19, 17, 82],
])
# soln
# [200, 119, 8]
# [120, 49, 15]
# [84, 19, 82]
M, N = mat.shape
K = 2
L = 2
MK = M // K
NL = N // L
# split the matrix into 'quadrants'
Q1 = mat[:MK * K, :NL * L].reshape(MK, K, NL, L).max(axis=(1, 3))
Q2 = mat[MK * K:, :NL * L].reshape(-1, NL, L).max(axis=2)
Q3 = mat[:MK * K, NL * L:].reshape(MK, K, -1).max(axis=1)
Q4 = mat[MK * K:, NL * L:].max()
# compose the individual quadrants into one new matrix
soln = np.vstack([np.c_[Q1, Q3], np.c_[Q2, Q4]])
print(soln)
# [[200 119 8]
# [120 49 15]
# [ 84 19 82]]
'M, N = mat.shape' sẽ rõ ràng hơn tại đây. Ngoài ra bạn nên chỉ ra rằng câu trả lời của bạn hoạt động ngay cả khi hạt nhân không phân chia nguồn, nhưng loại bỏ các ranh giới (và phát sinh một bản sao). – Eric