2014-10-10 11 views
5

मैं एक सरणी जो अंक का एक समूह होता है मिल गया है (3 डी वैक्टर, विशेष रूप से):अंकों की एक सरणी में एक मैट्रिक्स गुणा करने के लिए numpy का उपयोग करें?

pts = np.array([ 
    [1, 1, 1], 
    [2, 2, 2], 
    [3, 3, 3], 
    [4, 4, 4], 
    [5, 5, 5], 
]) 

और मैं एक परिवर्तन मैट्रिक्स द्वारा उन बिंदुओं में से हर एक गुणा करने के लिए करना चाहते हैं:

pts[0] = np.dot(transform_matrix, pts[0]) 
pts[1] = np.dot(transform_matrix, pts[1]) 
… 
pts[n] = np.dot(transform_matrix, pts[n]) 

मैं इसे कुशलतापूर्वक कैसे कर सकता हूं?

उत्तर

9

मुझे लगता है कि यह einsum संस्करण पहले लिखने में मदद करता है - इंडेक्स देखने के बाद आप अक्सर पहचान सकते हैं कि एक सरल संस्करण है। उदाहरण के लिए, से

>>> pts = np.random.random((5,3)) 
>>> transform_matrix = np.random.random((3,3)) 
>>> 
>>> pts_brute = pts.copy() 
>>> for i in range(len(pts_brute)): 
...   pts_brute[i] = transform_matrix.dot(pts_brute[i]) 
...  
>>> pts_einsum = np.einsum("ij,kj->ik", pts, transform_matrix) 
>>> np.allclose(pts_brute, pts_einsum) 
True 

शुरू कर आप देख सकते हैं यह बस है

>>> pts_dot = pts.dot(transform_matrix.T) 
>>> np.allclose(pts_brute, pts_dot) 
True 
+0

बहुत बढ़िया, धन्यवाद! इसके अलावा, यह 'einsum' के बारे में एक महान युक्ति है - धन्यवाद। –

3

मैट्रिक्स-आव्यूह गुणन "बैच-मोड" मैट्रिक्स वेक्टर गुणा, जहां दूसरी में प्रत्येक स्तंभ के रूप में सोचा जा सकता है मैट्रिक्स पहले से गुणा होने वाले वैक्टरों में से एक है, परिणामस्वरूप वेक्टर परिणामस्वरूप मैट्रिक्स के कॉलम हैं।

भी ध्यान रखें कि जब से (एबी) टी = बी टी एक टी, और इसलिए (दोनों पक्षों transposing द्वारा) ((एबी) टी) टी = AB = (बी टी एक टी) टी आप परिणाम वैक्टर पंक्तियों की होने के साथ batch- जा रहा है (बाईं) से गुणा स्थानांतरित दूसरा मैट्रिक्स के पहले मैट्रिक्स की पंक्तियां के बारे में एक ऐसी ही बयान कर सकते हैं, साँचा उत्पाद।

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