2010-06-04 17 views
6

पायथन में, एक एन एक्स पी मैट्रिक्स दिया गया, उदाहरण के लिए 4 एक्स 4, मैं एक मैट्रिक्स कैसे लौटा सकता हूं जो 4 x 2 है जो मैट्रिक्स की सभी 4 पंक्तियों के लिए पहले दो कॉलम और अंतिम दो कॉलम औसत करता है?औसत मैट्रिक्स कुशलतापूर्वक

उदा दिए गए:

एक = सरणी ([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15 , 16]])

एक मैट्रिक्स लौटाता है जिसमें औसत [:, 0] और एक [:, 1] और औसत [:, 2] और एक [:,3] का औसत होता है। मैं चाहता हूं कि यह एन एक्स पी के मनमाने ढंग से मैट्रिक्स के लिए काम करे, यह मानते हुए कि कॉलम की संख्या मैं एन का औसत कर रहा हूं, स्पष्ट रूप से एन द्वारा विभाजित है।

मुझे स्पष्टीकरण दें: प्रत्येक पंक्ति के लिए, मैं पहले दो कॉलम का औसत लेना चाहता हूं, फिर अंतिम दो स्तंभों का औसत लेना चाहता हूं। तो यह होगा:

1 + 2/2, 3 + 4/2 < - पंक्ति नए मैट्रिक्स के 2, आदि

- पंक्ति नए मैट्रिक्स 5 + 6/2, 7 + 8/2 < की 1

जो 4 x 4.

धन्यवाद के बजाय 4 से 2 मैट्रिक्स उत्पन्न करना चाहिए।

+0

आप एक 4x2 मैट्रिक्स चाहते हैं, लेकिन आप जो वर्णन करते हैं (एक [:, 0], आदि के साथ) लगता है जैसे यह 1x4 मैट्रिक्स होगा –

उत्तर

1

यह थोड़ा स्पष्ट नहीं है कि क्या n> 4 के साथ मैट्रिक्स के लिए होना चाहिए, लेकिन इस कोड तुम क्या चाहते हो जाएगा:

a = N.array([[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]], dtype=float) 
avg = N.vstack((N.average(a[:,0:2], axis=1), N.average(a[:,2:4], axis=1))).T 

यह पैदावार avg =

array([[ 1.5, 3.5], 
     [ 5.5, 7.5], 
     [ 9.5, 11.5], 
     [ 13.5, 15.5]]) 
1

यहाँ यह करने के लिए एक रास्ता है । आपको केवल groupsize को अन्य आकारों के साथ काम करने के लिए बदलने की आवश्यकता है, जैसा कि आपने कहा था, हालांकि मुझे पूरा यकीन नहीं है कि आप क्या चाहते हैं।

groupsize = 2 
out = np.hstack([np.mean(x,axis=1,out=np.zeros((a.shape[0],1))) for x in np.hsplit(a,groupsize)]) 

array([[ 1.5, 3.5], 
    [ 5.5, 7.5], 
    [ 9.5, 11.5], 
    [ 13.5, 15.5]]) 

पैदावार out के लिए। उम्मीद है कि यह आपको कुछ विचार बताता है कि आप वास्तव में क्या करना चाहते हैं। उदाहरण के लिए आप a के आयामों पर निर्भर groupsize बना सकते हैं।

5

कुछ गणित का उपयोग करने के बारे में कैसे? आप एक मैट्रिक्स M = [[0.5,0],[0.5,0],[0,0.5],[0,0.5]] परिभाषित कर सकते हैं ताकि A*M वह हो जो आप चाहते हैं।

from numpy import array, matrix 

A = array([[1, 2, 3, 4], 
      [5, 6, 7, 8], 
      [9, 10, 11, 12], 
      [13, 14, 15, 16]]) 
M = matrix([[0.5,0], 
      [0.5,0], 
      [0,0.5], 
      [0,0.5]]) 
print A*M 

उत्पन्न एम बहुत सरल है भी, प्रविष्टियों 1/n या शून्य कर रहे हैं।

4

आकृति बदलें - मतलब हो - नयी आकृति प्रदान

>>> a.reshape(-1, a.shape[1]//2).mean(1).reshape(a.shape[0],-1) 
array([[ 1.5, 3.5], 
     [ 5.5, 7.5], 
     [ 9.5, 11.5], 
     [ 13.5, 15.5]]) 

किसी भी सरणी आकार के लिए काम करने के लिए माना जाता है, और नयी आकृति प्रदान एक प्रति नहीं है।

संबंधित मुद्दे