2010-11-11 8 views
12

में कैसे बदल सकता हूं मेरे पास न्यूमपी में तीन समान आकार के स्क्वायर मैट्रिस हैं। मैं इन्हें ब्लॉक-विकर्ण मैट्रिक्स में जोड़ना चाहता हूं।मैं ब्लॉक को ब्लॉकडागोनल मैट्रिक्स (NumPy)

उदाहरण:

a1 = np.array([[1,1,1],[1,1,1],[1,1,1]]) 
a2 = np.array([[2,2,2],[2,2,2],[2,2,2]]) 
a3 = np.array([[3,3,3],[3,3,3],[3,3,3]]) 

r = np.array([[1,1,1,0,0,0,0,0,0],[1,1,1,0,0,0,0,0,0],[1,1,1,0,0,0,0,0,0],[0,0,0,2,2,2,0,0,0],[0,0,0,2,2,2,0,0,0],[0,0,0,2,2,2,0,0,0],[0,0,0,0,0,0,3,3,3],[0,0,0,0,0,0,3,3,3],[0,0,0,0,0,0,3,3,3]]) 

यह करने के लिए सबसे अच्छा तरीका क्या है?

उत्तर

18

scipy.linalg स्वचालित रूप से

>>> a1 = np.array([[1,1,1],[1,1,1],[1,1,1]]) 
>>> a2 = np.array([[2,2,2],[2,2,2],[2,2,2]]) 
>>> a3 = np.array([[3,3,3],[3,3,3],[3,3,3]]) 
>>> import scipy.linalg 
>>> scipy.linalg.block_diag(a1, a2, a3) 
array([[1, 1, 1, 0, 0, 0, 0, 0, 0], 
     [1, 1, 1, 0, 0, 0, 0, 0, 0], 
     [1, 1, 1, 0, 0, 0, 0, 0, 0], 
     [0, 0, 0, 2, 2, 2, 0, 0, 0], 
     [0, 0, 0, 2, 2, 2, 0, 0, 0], 
     [0, 0, 0, 2, 2, 2, 0, 0, 0], 
     [0, 0, 0, 0, 0, 0, 3, 3, 3], 
     [0, 0, 0, 0, 0, 0, 3, 3, 3], 
     [0, 0, 0, 0, 0, 0, 3, 3, 3]]) 
>>> r = np.array([[1,1,1,0,0,0,0,0,0],[1,1,1,0,0,0,0,0,0],[1,1,1,0,0,0,0,0,0], [0,0,0,2,2,2,0,0,0],[0,0,0,2,2,2,0,0,0],[0,0,0,2,2,2,0,0,0],[0,0,0,0,0,0,3,3,3],[0,0,0,0,0,0,3,3,3],[0,0,0,0,0,0,3,3,3]]) 
>>> (scipy.linalg.block_diag(a1, a2, a3) == r).all() 
True 
+0

यह अच्छा होगा यदि यह numpy में उपलब्ध थे होगा (एक और निर्भरता की आवश्यकता के बिना) यह करने के लिए एक block_diag समारोह है। – amcnabb

+0

scipy numpy के शीर्ष पर बनाया गया है। मुझे लगता है कि 'scipy.array' को' numpy.array' जैसी ही फैशन में काफी काम करना चाहिए। – hBy2Py

2

आप इस विशेष सरणी r चाहते हैं, शायद सबसे आसान तरीका होगा: a2, a3 मनमाना 2-आयामी सरणी हो सकता है

r=np.kron(np.diag([1,2,3]),np.ones((3,3),dtype='int')) 

तो a1,, तो शायद सबसे आसान तरीका है:

a1=np.asmatrix(a1) 
a2=np.asmatrix(a2) 
a3=np.asmatrix(a3) 
z=np.asmatrix(np.zeros((3,3))) 
r=np.asarray(np.bmat('a1, z, z; z, a2, z; z, z, a3')) 

एक वैकल्पिक धीमी विधि है:

r=(np.kron([[1,0,0],[0,0,0],[0,0,0]],a1) 
    +np.kron([[0,0,0],[0,1,0],[0,0,0]],a2) 
    +np.kron([[0,0,0],[0,0,0],[0,0,1]],a3)) 
संबंधित मुद्दे