2013-07-08 6 views
5

this question में यह कैसे lower और upper किसी दिए गए मैट्रिक्स के triagular भागों को एक्सेस कर समझाया गया है करने के लिए वापस, कहते हैं:एक -1 डी सरणी में एक सममित मैट्रिक्स (2 डी सरणी) की ऊपरी/निचले त्रिकोणीय भाग को बदलने और यह 2 डी प्रारूप

indices = np.triu_indices_from(m) 
a = np.asarray(m[indices])[-1] 
#array([11, 12, 13, 22, 23, 33]) 

a साथ गणना की एक बहुत कुछ कर, अपने मूल्यों को बदलने के बाद, यह करने के लिए उपयोग किया जाएगा:

m = np.matrix([[11, 12, 13], 
       [21, 22, 23], 
       [31, 32, 33]]) 

यहाँ मैं एक 1 डी सरणी है, जो कर किया जा सकता है में मैट्रिक्स को बदलने की जरूरत है एक sy भरें mmetric 2 डी सरणी:

new = np.zeros(m.shape) 
for i,j in enumerate(zip(*indices)): 
    new[j]=a[i] 
    new[j[1],j[0]]=a[i] 

रिटर्निंग:

array([[ 11., 12., 13.], 
     [ 12., 22., 23.], 
     [ 13., 23., 33.]]) 

वहाँ एक बेहतर तरीका यह पूरा करने के है? अधिक विशिष्ट रूप से, 2 डी सरणी के पुनर्निर्माण के लिए पाइथन लूप से परहेज?

उत्तर

5

क्या आप सिर्फ एक सममित सरणी बनाना चाहते हैं? आप विकर्ण सूचकांक को पूरी तरह से छोड़ सकते हैं।

>>> m=np.array(m) 
>>> inds = np.triu_indices_from(m,k=1) 
>>> m[(inds[1], inds[0])] = m[inds] 
>>> m 
array([[11, 12, 13], 
     [12, 22, 23], 
     [13, 23, 33]]) 

एक से एक सममित सरणी बनाना:

>>> new = np.zeros((3,3)) 
>>> vals = np.array([11, 12, 13, 22, 23, 33]) 
>>> inds = np.triu_indices_from(new) 
>>> new[inds] = vals 
>>> new[(inds[1], inds[0])] = vals 
>>> new 
array([[ 11., 12., 13.], 
     [ 12., 22., 23.], 
     [ 13., 23., 33.]]) 
+0

मैं सममित '2 डी-array' पर लौटने से पहले मध्यम पद सरणी' A' कार्रवाई करने के लिए है –

+0

आप में हेरफेर कर सकते हैं 'मीटर [indup ] 'जब तक यह सही क्रम में 1 डी numpy सरणी देता है। क्या इसके साथ कोई विशेष समस्या है? – Daniel

+0

को 'सरणी ([11, 12, 13, 22, 23, 33]) से संबंधित एक 2 डी-सरणी सरणी ([[11,12,13], [12,22,23] से आना है, [13,23,33]]) –

3

आप इस तरह के numpy.triu, numpy.tril, और numpy.diag के रूप में एक त्रिकोणीय से एक सममित मैट्रिक्स बनाने के लिए Array Creation Routines उपयोग कर सकते हैं। यहां एक साधारण 3x3 उदाहरण है।

a = np.array([[1,2,3],[4,5,6],[7,8,9]]) 
array([[1, 2, 3], 
     [4, 5, 6], 
     [7, 8, 9]]) 

a_triu = np.triu(a, k=0) 
array([[1, 2, 3], 
     [0, 5, 6], 
     [0, 0, 9]]) 

a_tril = np.tril(a, k=0) 
array([[1, 0, 0], 
     [4, 5, 0], 
     [7, 8, 9]]) 

a_diag = np.diag(np.diag(a)) 
array([[1, 0, 0], 
     [0, 5, 0], 
     [0, 0, 9]]) 

पक्षांतरित जोड़ें और घटाना विकर्ण:

a_sym_triu = a_triu + a_triu.T - a_diag 
array([[1, 2, 3], 
     [2, 5, 6], 
     [3, 6, 9]]) 

a_sym_tril = a_tril + a_tril.T - a_diag 
array([[1, 4, 7], 
     [4, 5, 8], 
     [7, 8, 9]]) 
+0

टिप के लिए धन्यवाद;) –

+0

मैं उन्हीं चरणों निष्पादित लेकिन 'A' पता चला है ' सरणी ([[22, 12, 13], [12, 44, 23], होने के लिए [13., 23., 66।]]) विकर्ण तत्व स्वयं को – Madhav

+1

@ माधव में जोड़ दिए जाते हैं, इस पोस्ट के बाद np.tril और np.triu को np.tril और np.triu अपडेट किया जा सकता है जब k = 0 के विकर्ण शामिल होते हैं। या मेरी मूल प्रतिक्रिया अभी गलत हो सकती है। मैंने np.diag के साथ विकर्ण को घटाकर इसे सही किया है। –

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