numpy

2017-02-26 10 views
6

का उपयोग करके 2 डी सरणी पर अधिकतम/औसत पूलिंग करने के लिए कैसे करें 2 डी (एम एक्स एन) मैट्रिक्स और 2 डी कर्नेल (के एक्स एल) दिया गया है, मैं एक मैट्रिक्स कैसे लौटा सकता हूं जो अधिकतम या माध्य का परिणाम है छवि पर दिए गए कर्नेल का उपयोग करके पूलिंग?numpy

यदि संभव हो तो मैं numpy का उपयोग करना चाहता हूं।

नोट: एम, एन, के, एल दोनों भी अजीब हो सकते हैं और उन्हें एक दूसरे द्वारा पूरी तरह विभाजित नहीं होना चाहिए, उदाहरण के लिए: 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) 

देता है: छवि का आकार समान रूप से kernal से विभाज्य है

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

'एम, एन = mat.shape' यहां स्पष्ट होगा। साथ ही आपको यह इंगित करना चाहिए कि आपका उत्तर तब भी काम करता है जब कर्नेल स्रोत को विभाजित नहीं करता है, लेकिन सीमाओं को छोड़ देता है (और एक प्रतिलिपि बनाता है)। – Eric