2015-01-30 13 views
5

'np.einsum' के प्रलेखन में जो मैंने समझा, वह यह है कि एक क्रमपरिवर्तन स्ट्रिंग, वेक्टर में धुरी का क्रमपरिवर्तन प्रदान करेगी। यह निम्नलिखित प्रयोग द्वारा की पुष्टि की है:numpy einsum

>>> M = np.arange(24).reshape(2,3,4) 
>>> M.shape 
(2, 3, 4) 
>>> np.einsum('ijk', M).shape 
(2, 3, 4) 
>>> np.einsum('ikj', M).shape 
(2, 4, 3) 
>>> np.einsum('jik', M).shape 
(3, 2, 4) 

लेकिन यह मुझे समझ में नहीं कर सकते हैं:

>>> np.einsum('kij', M).shape 
(3, 4, 2) 

मैं उम्मीद होती है (4, 2, 3) के बजाय ... क्या मेरी समझ के साथ गलत क्या है?

उत्तर

7

जब आउटपुट हस्ताक्षर निर्दिष्ट नहीं किया गया है (यानी सब्सक्रिप्शन स्ट्रिंग में '->' नहीं है), einsum इसे दिए गए अक्षरों को लेकर और उन्हें वर्णानुक्रम में व्यवस्थित करके बना देगा।

इसका मतलब है कि

np.einsum('kij', M) 

वास्तव में

np.einsum('kij->ijk', M) 

तो 'kij' लेबल इनपुट मैट्रिक्स की कुल्हाड़ियों, नहीं उत्पादन मैट्रिक्स लेखन के बराबर है, और इस के क्रमचय की ओर जाता है आपके द्वारा देखी गई अक्ष।

इस बिंदु दस्तावेज में स्पष्ट नहीं किया जाता है, लेकिन C source code for einsum में टिप्पणी की देखा जा सकता है:

/* 
* If there is no output signature, create one using each label 
* that appeared once, in alphabetical order 
*/ 

M की कुल्हाड़ियों इच्छित क्रम में permuted कर रहे हैं सुनिश्चित करने के लिए इसे देने के लिए आवश्यक हो सकता है einsum दोनों इनपुट और आउटपुट मैट्रिक्स के लिए लेबलिंग:

>>> np.einsum('ijk->kij', M).shape 
(4, 2, 3) 
+0

तो (मेरी समझ में) स्ट्रिंग क्रमचय का प्रतिलोम का प्रतिनिधित्व करता है ... –

+0

हां, यह के बारे में सोचना एक अच्छा तरीका हो सकता है क्या उत्पादन तब होगा जब आउटपुट हस्ताक्षर नहीं दिया जाता है। –