2013-07-03 21 views
7

मान लें कि हमारे पास दो matrices A और B हैं और मैट्रिक्स CA*B (मैट्रिक्स गुणा तत्व-वार नहीं) होने दें। हम केवल C की विकर्ण प्रविष्टियां प्राप्त करना चाहते हैं, जो np.diagonal(C) के माध्यम से किया जा सकता है। हालांकि, यह अनावश्यक समय ओवरहेड का कारण बनता है, क्योंकि हम में प्रत्येक पंक्ति के गुणों को B के कॉलम के साथ गुणा कर रहे हैं, जिसमें एक ही 'आईडी' है, जो पंक्ति 1 के साथ A की पंक्ति 1 है B, A की पंक्ति 2 B के कॉलम 2 के साथ और इसी तरह: गुणा जो C के विकर्ण का निर्माण करते हैं। क्या अम्पी का उपयोग करके कुशलता से हासिल करने का कोई तरीका है? मैं नियंत्रण के लिए लूप का उपयोग करना चाहता हूं कि कौन सी पंक्ति को कॉलम के साथ गुणा किया जाता है, इसके बजाय, मैं एक अंतर्निहित numpy विधि की कामना करता हूं जो प्रदर्शन को अनुकूलित करने के लिए इस तरह के ऑपरेशन करता है।(पायथन) ए * बी करने के बिना विकर्ण (ए * बी) कैसे प्राप्त करें?

अग्रिम धन्यवाद ..

+0

किसी को भी देखने के लिए बस एक नोट: NumPy में 'ए * बी' तत्व-वार गुणा है, मैट्रिक्स गुणा नहीं है (जो' a.dot (b) 'है)। – Blair

+0

'ए' और 'बी' प्रकार' ndarray' या' matrix' हैं? – Bitwise

+0

@ ब्लेयर, यह मामला है यदि 'ए' और' बी' 'numpy.array' हैं। अगर वे 'numpy.matrix' हैं, तो आप 'ए * बी' –

उत्तर

15

मैं einsum यहाँ का उपयोग कर सकते:

>>> a = np.random.randint(0, 10, (1000,1000)) 
>>> b = np.random.randint(0, 10, (1000,1000)) 
>>> %timeit np.diagonal(a.dot(b)) 
1 loops, best of 3: 7.04 s per loop 
>>> %timeit np.einsum('ij,ji->i', a, b) 
100 loops, best of 3: 7.49 ms per loop 

[नोट:

>>> a = np.random.randint(0, 10, (3,3)) 
>>> b = np.random.randint(0, 10, (3,3)) 
>>> a 
array([[9, 2, 8], 
     [5, 4, 0], 
     [8, 0, 6]]) 
>>> b 
array([[5, 5, 0], 
     [3, 5, 5], 
     [9, 4, 3]]) 
>>> a.dot(b) 
array([[123, 87, 34], 
     [ 37, 45, 20], 
     [ 94, 64, 18]]) 
>>> np.diagonal(a.dot(b)) 
array([123, 45, 18]) 
>>> np.einsum('ij,ji->i', a,b) 
array([123, 45, 18]) 

बड़े विन्यास के लिए, यह सीधे गुणा कर की तुलना में बहुत तेजी से हो जाएगा मूल रूप से मैं elementwise किया था संस्करण, ii,ii->i, मैट्रिक्स गुणा के बजाय। वही einsum चाल काम करते हैं।]

+1

ग्रेट समाधान और उपयोगी बेंचमार्क! धन्यवाद! – Curious

-1
def diag(A,B): 
    diags = [] 
    for x in range(len(A)): 
     diags.append(A[x][x] * B[x][x]) 
    return diags 

मेरा मानना ​​है कि इसके बाद के संस्करण कोड है कि आप देख रहे हैं है।

+4

को स्पष्ट नहीं करने के लिए खेद है कि यह नहीं है कि [मैट्रिक्स गुणा] (http://en.wikipedia.org/wiki/Matrix_multiplication#Matrix_product_.28two_matrices.29) –

+0

काम करता है माफ़ कीजिये। पता नहीं था कि क्या आपको स्केलर उत्पाद या मैट्रिक्स उत्पाद का मतलब है या नहीं। – BenjaminCohen

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