2016-01-05 8 views
5

मान लें कि हम एक मैट्रिक्स के डॉट उत्पाद और एक स्तंभ वेक्टर गणना करने के लिए करना चाहते हैं:पाइथन/न्यूम्पी को मैट्रिक्स/वेक्टर डॉट उत्पाद के लिए पंक्ति वेक्टर की आवश्यकता क्यों होती है?

Matrix dot vector

तो Numpy/पायथन में ये हम चले:

: में

a=numpy.asarray([[1,2,3], [4,5,6], [7,8,9]]) 
b=numpy.asarray([[2],[1],[3]]) 
a.dot(b) 

परिणाम

सरणी ([[13], [31], [4 9]])

अभी तक, इतना अच्छा है, हालांकि यह भी क्यों काम कर रहा है? में

b=numpy.asarray([2,1,3]) 
a.dot(b) 

परिणाम:

सरणी ([13, ​​31, 49])

मैं उम्मीद होती है कि [2,1,3] एक पंक्ति वेक्टर है (जिसके लिए डॉट उत्पाद को लागू करने के लिए एक ट्रांसपोज़ की आवश्यकता होती है), लेकिन नम्पी डिफ़ॉल्ट रूप से कॉलम वैक्टर के रूप में सरणी को देखता है (मैट्रिक्स गुणा के मामले में)?

यह कैसे काम करता है?

संपादित करें:

और क्यों है:

b=numpy.asarray([2,1,3]) 
b.transpose()==b 

तो मैट्रिक्स डॉट वेक्टर सरणी काम (ऐसा है तो यह एक स्तंभ वेक्टर के रूप में यह देखता है), लेकिन अन्य कार्यों (स्थानांतरित) करता है काम नहीं करता। यह वास्तव में लगातार डिजाइन नहीं है?

+0

संबंधित प्रश्न: http://stackoverflow.com/questions/17428621/python-differentiating-between-row-and-column-vectors – Mel

+1

'सरणी ([2, 1, 3]) 'पंक्ति पंक्ति नहीं है या एक कॉलम वेक्टर। यह सिर्फ एक वेक्टर है। – user2357112

+0

@ user2357112 क्या आपको इसे एक वेक्टर भी कहना चाहिए? मुझे लगता है कि यह अक्सर देखा भ्रम का मुख्य स्रोत है। "वेक्टर" लोगों द्वारा आम तौर पर '[एन x 1] 'या' [1 x n] 'ऑब्जेक्ट का संदर्भ मिलता है। लेकिन जैसा कि मैंने इसे देखा, बिंदु बिल्कुल ठीक है कि 1 डी 'ndarray' का एक आयाम है, इसलिए मैं कहूंगा कि यह एक वेक्टर नहीं है, बल्कि एक सरणी है। (और निश्चित रूप से, विशेष एन एन एरे हैं जिन्हें वैक्टर या मैट्रिस के रूप में माना जा सकता है, अर्थात् 'n == 2' :) –

उत्तर

4

आइए पहले समझें कि dot ऑपरेशन को numpy में परिभाषित किया गया है।

(चर्चा से बाहर प्रसारण नियमों छोड़कर, सादगी के लिए) आप dot(A,B) प्रदर्शन कर सकते हैं यदि का एक (यानी A.shape[-1]) पिछले आयाम बी के अगले करने वाली पिछले आयाम के रूप में एक ही है (यानी B.shape [- 2]) यदि बी.एनडीआईएम> = 2, और बस बी का आयाम बी। बीडीआईएम == 1।

दूसरे शब्दों में, अगर A.shape=(N1,...,Nk,X) और B.shape=(M1,...,M(j-1),X,Mj) (कृपया ध्यान आम X)। परिणामी सरणी के आकार (N1,...,Nk,M1,...,Mj) होगा (ध्यान दें कि X गिरा दिया गया था)।

या, A.shape=(N1,...,Nk,X) और B.shape=(X,)। परिणामी सरणी के आकार (N1,...,Nk) होगा (ध्यान दें कि X गिरा दिया गया था)।

आपका उदाहरण काम करते हैं क्योंकि वे नियमों को पूरा (पहला उदाहरण प्रथम, द्वितीय संतुष्ट दूसरे को संतुष्ट):

a=numpy.asarray([[1,2,3], [4,5,6], [7,8,9]]) 
b=numpy.asarray([[2],[1],[3]]) 
a.shape, b.shape, '->', a.dot(b).shape # X=3 
=> ((3, 3), (3, 1), '->', (3, 1)) 

b=numpy.asarray([2,1,3]) 
a.shape, b.shape, '->', a.dot(b).shape # X=3 
=> ((3, 3), (3,), '->', (3,)) 

मेरे सिफारिश यह है कि, जब numpy का उपयोग कर, नहीं लगता कि है "पंक्ति/कॉलम वैक्टर" के संदर्भ में, और यदि संभव हो तो "वैक्टर" के संदर्भ में नहीं सोचें, बल्कि "आकार एस के साथ एक सरणी" के संदर्भ में। इसका मतलब है कि दोनों पंक्ति वैक्टर और कॉलम वेक्टर बस "1 डीआईएम सरणी" हैं। जहां तक ​​numpy का संबंध है, वे एक और एक हैं।

इससे यह स्पष्ट हो जाना चाहिए कि आपके मामले में b.transponse() is the same as b क्यों है। b एक 1 डीआईएम सरणी होने पर, transposed, 1 डीआईएम सरणी बनी हुई है। Transpose 1dim सरणी को प्रभावित नहीं करता है।

+1

ऐसा नहीं है कि 'numpy.dot' 2 से अधिक आयाम के तर्कों का व्यवहार कैसे करता है। मैं सलाह देता हूं कि आपके उत्तर से उच्च-आयाम व्यवहार को छोड़ दें; डॉट का उच्च-आयाम व्यवहार बहुत उपयोगी नहीं है। – user2357112

+0

@ user2357112, इसे इंगित करने के लिए धन्यवाद। मैंने अपना जवाब तय कर दिया। – shx2

+1

@ user2357112 * "डॉट का उच्च-आयाम व्यवहार बहुत उपयोगी नहीं है" * - शायद आप के लिए नहीं! –

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