numpy - Fast inverse and transpose matrix in Python -
मेरे पास एक बड़ा मैट्रिक्स ए आकृति का
(n, n, 3, 3 ) के साथ
n के बारे में
5000 है। अब मुझे मैट्रिक्स
a : व्युत्क्रम और स्थानांतरित करना चाहते हैं: numpy as np a = np.random.rand (1000, 1000, 3, 3) पहचान = एनपी। निवासी (3, dtype = A.dtype) Ainv = np.zeros_like (ए) एट्रांस = np.zeros_like (ए) के लिए मैं रेंज (1000) में: सीमा के लिए जी में (1000): ऐन्विन [i, j ] = Np.linalg.solve (ए [i, j], पहचान) एट्रांस [i, j] = np.transpose (ए [i, j])
क्या कोई तेज़ है , यह करने के लिए अधिक कुशल तरीका है?
यह मेरा एक प्रोजेक्ट से लिया जाता है, जहां मैं भी करता हूं Vexized रैखिक बीजगणित कई 3x3 मैट्रिक्स पर।
ध्यान दें कि केवल 3 से अधिक एक लूप है; N पर लूप नहीं है, इसलिए महत्वपूर्ण आयामों में कोड को सदिश किया गया है। मैं यह कैसे C / numba एक्सटेंशन की तुलना में एक ही बात करने के लिए तुलना करने के लिए ज़मानत नहीं करना चाहता, हालांकि, प्रदर्शन के आधार पर। यह काफी तेजी से अभी भी होने की संभावना है, लेकिन कम से कम यह पानी से बाहर n पर छोरों को उड़ाता है।
def adjoint (ए): "" "det द्वारा विभाजन के बिना उलटा गणना; ..xv3xc3 इनपुट, या मैट्रिक्स की सरणी के लिए "एआई = एनपी.एम्प्टी_एक्लो (ए)" एक्सरेन्ज (3) में: एआई [..., i ,:] = np.cross (ए [..., I-2 ,:], ए [..., i-1 ,:]) एआई डीएफ़ inverse_transpose (ए): "" "3x3 मैट्रिक्स के ढेर के लिए व्युत्क्रम-पारगमन" कुशलतापूर्वक गणना "" I = adjoint (ए ) Det = डॉट (I, ए)। मीन (अक्ष = -1) रिटर्न I / det [..., कोई नहीं, कोई नहीं] def उलटा (ए): "" "3x3 मैट्रिक्स के एक स्टैक के व्युत्क्रम" "" वापसी Np.swapaxes (inverse_transpose (A), -1, -2) def डॉट (ए, बी): "" "डॉक्स एरेज़ ऑफ वेक्स; अंतिम इंडेक्सेस पर कॉन्ट्रैक्ट" "एनपी.इंसम ('... i। ..i-> ... ..., A, B) A = np.random.rand (2,2,3,3) I = उलटा (ए) प्रिंट np.einsum ('... ij, .. । जेके ', ए, आई)
Comments
Post a Comment