2017-02-26 1 views
6

2D (M x N) 행렬과 2D 커널 (K x L)이 주어지면 최대 또는 평균의 결과 인 행렬을 어떻게 반환 할 수 있습니까? 이미지 위에 주어진 커널을 사용하여 풀링?numpy를 사용하여 2 차원 배열에서 최대/평균 풀링을 수행하는 방법

가능한 경우 numpy를 사용하고 싶습니다.

참고 : M, N, K, L은 짝수 또는 홀수 일 수 있으며 서로가 완벽하게 나눌 필요는 없습니다 (예 : 7x5 매트릭스 및 2x2 커널). 최대 풀링의

예 :

matrix: 
array([[ 20, 200, -5, 23], 
     [ -13, 134, 119, 100], 
     [ 120, 32, 49, 25], 
     [-120, 12, 09, 23]]) 
kernel: 2 x 2 
soln: 
array([[ 200, 119], 
     [ 120, 49]]) 

답변

12

당신은 scikit 이미지 block_reduce 사용할 수 있습니다

import numpy as np 
import skimage.measure 

a = np.array([ 
     [ 20, 200, -5, 23], 
     [ -13, 134, 119, 100], 
     [ 120, 32, 49, 25], 
     [-120, 12, 9, 23] 
]) 
skimage.measure.block_reduce(a, (2,2), np.max) 

을 제공합니다 : 이미지의 크기가 커널 인에 의해 균등하게 나눌

array([[200, 119], 
     [120, 49]]) 
4

경우 크기가 같으면 어레이 모양을 바꿀 수 있으며 max 또는 mean을 적합하게 사용할 수 있습니다. 당신이 커널의 짝수 번호가없는 경우

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]] 

는 별도로 경계를 처리해야합니다. (주석에서 지적한 바와 같이, 이것은 매트릭스가 복사되어 성능에 영향을 미친다).

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]] 
+0

'M, N = mat.shape'이 ​​여기에 명확 해집니다. 또한 커널이 소스를 나눌지라도 경계가 파기 되더라도 (그리고 복사본이 생겨도) 대답이 작동한다는 것을 지적해야합니다. – Eric

관련 문제