NumPy 1.14 - Elementary Function

सामान्यीकृत यूनिवर्सल फंक्शन एपीआई




numpy

सामान्यीकृत यूनिवर्सल फंक्शन एपीआई

केवल स्केलर पर ही नहीं बल्कि वैक्टर (या सरणियों) पर भी फ़ंक्शन करने के लिए एक सामान्य आवश्यकता है। यह अवधारणा सार्वभौमिक कार्यों (ufuncs) को सामान्य करके NumPy में महसूस की जाती है। नियमित रूप से ufuncs में, प्रारंभिक फ़ंक्शन तत्व-बाय-एलिमेंट ऑपरेशन्स तक सीमित है, जबकि सामान्यीकृत संस्करण (gufuncs) "सब-एरे" ऑपरेशंस द्वारा "सब-एरे" का समर्थन करता है। पर्ल वेक्टर लाइब्रेरी पीडीएल एक समान कार्यक्षमता प्रदान करता है और इसकी शर्तें निम्नलिखित में फिर से उपयोग की जाती हैं।

प्रत्येक सामान्यीकृत ufunc में इसके साथ जुड़ी जानकारी होती है जो बताती है कि इनपुट की "कोर" आयामीता क्या है, साथ ही साथ आउटपुट की संबंधित गतिशीलता (तत्व-वार ufuncs में शून्य कोर आयाम हैं)। सभी तर्कों के लिए मुख्य आयामों की सूची को एक ufunc के "हस्ताक्षर" कहा जाता है। उदाहरण के लिए, ufunc numpy.add में दो स्केलर इनपुट और एक स्केलर आउटपुट को परिभाषित करने वाले हस्ताक्षर (),()->()

एक अन्य उदाहरण (i),(i)->() हस्ताक्षर के साथ फ़ंक्शन inner1d(a, b) (i),(i)->() । यह प्रत्येक इनपुट के अंतिम अक्ष के साथ आंतरिक उत्पाद को लागू करता है, लेकिन शेष सूचकांकों को बरकरार रखता है। उदाहरण के लिए, जहाँ आकृति का a (3, 5, N) और b आकार का है (5, N) , यह आकार (3,5) का आउटपुट लौटाएगा। अंतर्निहित प्राथमिक कार्य को 3 * 5 बार कहा जाता है। हस्ताक्षर में, हम आउटपुट के लिए प्रत्येक इनपुट और शून्य कोर आयाम () लिए एक कोर आयाम (i) निर्दिष्ट करते हैं, क्योंकि यह दो 1-डी सरण लेता है और एक स्केलर लौटाता है। समान नाम i का उपयोग करके, हम निर्दिष्ट करते हैं कि दो संबंधित आयाम समान आकार के होने चाहिए।

मुख्य आयामों से परे के आयामों को "लूप" आयाम कहा जाता है। उपरोक्त उदाहरण में, यह (3, 5) से मेल खाती है।

हस्ताक्षर यह निर्धारित करता है कि प्रत्येक इनपुट / आउटपुट ऐरे के आयाम कोर और लूप आयामों में कैसे विभाजित हैं:

  1. हस्ताक्षर में प्रत्येक आयाम आकार गुच्छे के अंत से शुरू होने वाले इसी पारित-सरणी के आयाम से मेल खाता है। ये मुख्य आयाम हैं, और उन्हें सरणियों में उपस्थित होना चाहिए, या एक त्रुटि उठानी होगी।
  2. हस्ताक्षर में एक ही लेबल को सौंपे गए कोर आयाम (जैसे i inner1d 1 inner1d के s (i),(i)->() ) का बिल्कुल मिलान आकार होना चाहिए, कोई प्रसारण नहीं किया जाता है।
  3. कोर आयामों को सभी इनपुटों से हटा दिया जाता है और शेष आयामों को एक साथ प्रसारित किया जाता है, लूप आयामों को परिभाषित किया जाता है।
  4. प्रत्येक आउटपुट का आकार लूप आयामों और आउटपुट के मुख्य आयामों से निर्धारित होता है

आमतौर पर, आउटपुट में सभी कोर आयामों का आकार एक कोर सरणी के आकार द्वारा इनपुट सरणी में एक ही लेबल के साथ निर्धारित किया जाएगा। यह एक आवश्यकता नहीं है, और एक हस्ताक्षर को परिभाषित करना संभव है जहां एक आउटपुट में पहली बार एक लेबल आता है, हालांकि इस तरह के फ़ंक्शन को कॉल करते समय कुछ सावधानी बरतनी चाहिए। एक उदाहरण होगा कार्य euclidean_pdist(a) , हस्ताक्षर (n,d)->(p) , जिसमें n d -dimensional वैक्टर की एक सरणी दी गई है, उन सभी के साथ अद्वितीय यूक्लिडियन दूरी की गणना करता है। इसलिए आउटपुट आयाम p को n * (n - 1) / 2 बराबर होना चाहिए, लेकिन सही आकार के आउटपुट सरणी में पास करना कॉलर की जिम्मेदारी है। यदि आउटपुट के कोर आयाम का आकार इनपुट या आउटपुट सरणी में पारित नहीं किया जा सकता है, तो एक त्रुटि उठाई जाएगी।

ध्यान दें: NumPy 1.10.0 से पहले, कम सख्त जांच जगह में थी: लापता कोर आयामों को आवश्यक रूप से 1 के आकार में तैयार करके बनाया गया था, एक ही लेबल वाले कोर आयामों को एक साथ प्रसारित किया गया था, और अनिर्धारित आयामों को आकार 1 के साथ बनाया गया था।

परिभाषाएं

प्राथमिक कार्य
प्रत्येक ufunc में एक प्रारंभिक फ़ंक्शन होता है जो सरणी तर्कों के सबसे छोटे हिस्से पर सबसे बुनियादी ऑपरेशन करता है (जैसे दो संख्याओं को जोड़ना दो सरणियों को जोड़ने में सबसे बुनियादी ऑपरेशन है)। Ufunc सरणियों के विभिन्न भागों पर कई बार प्राथमिक कार्य को लागू करता है। प्राथमिक कार्यों के इनपुट / आउटपुट वैक्टर हो सकते हैं; उदाहरण के लिए, inner1d का प्राथमिक कार्य इनपुट के रूप में दो वैक्टर लेता है।
हस्ताक्षर
एक हस्ताक्षर एक स्ट्रिंग है जो ufunc के प्रारंभिक कार्य के इनपुट / आउटपुट आयामों का वर्णन करता है। अधिक जानकारी के लिए नीचे अनुभाग देखें।
कोर आयाम
प्राथमिक फ़ंक्शन के प्रत्येक इनपुट / आउटपुट की गतिशीलता को इसके मुख्य आयामों द्वारा परिभाषित किया गया है (शून्य कोर आयाम एक स्केलर इनपुट / आउटपुट के अनुरूप हैं)। कोर आयाम इनपुट / आउटपुट सरणियों के अंतिम आयामों पर मैप किए जाते हैं।
आयाम का नाम
एक आयाम नाम हस्ताक्षर में एक मुख्य आयाम का प्रतिनिधित्व करता है। विभिन्न आयाम एक नाम साझा कर सकते हैं, यह दर्शाता है कि वे एक ही आकार के हैं।
आयाम सूचकांक
आयाम सूचकांक एक पूर्णांक है जो आयाम नाम का प्रतिनिधित्व करता है। यह हस्ताक्षर में प्रत्येक नाम की पहली घटना के क्रम के अनुसार आयाम नामों की गणना करता है।

हस्ताक्षर का विवरण

हस्ताक्षर इनपुट और आउटपुट चर की "कोर" आयामीता को परिभाषित करता है, और इस तरह आयामों के संकुचन को भी परिभाषित करता है। हस्ताक्षर निम्न प्रारूप की एक स्ट्रिंग द्वारा दर्शाया गया है:

  • प्रत्येक इनपुट या आउटपुट ऐरे के मुख्य आयाम कोष्ठक में आयाम नामों की एक सूची द्वारा दर्शाए जाते हैं, (i_1,...,i_N) ; अदिश इनपुट / आउटपुट को () द्वारा निरूपित किया जाता है। i_1 , i_2 , आदि के बजाय, कोई भी मान्य पायथन चर नाम का उपयोग कर सकता है।
  • विभिन्न तर्कों के लिए आयाम सूचियों को "," द्वारा अलग किया जाता है। इनपुट / आउटपुट तर्क "->" द्वारा अलग किए गए हैं।
  • यदि कोई एक से अधिक स्थानों में समान आयाम नाम का उपयोग करता है, तो यह इसी आयाम के आकार को लागू करता है।

हस्ताक्षर का औपचारिक सिंटैक्स निम्नानुसार है:

<Signature>            ::= <Input arguments> "->" <Output arguments>
<Input arguments>      ::= <Argument list>
<Output arguments>     ::= <Argument list>
<Argument list>        ::= nil | <Argument> | <Argument> "," <Argument list>
<Argument>             ::= "(" <Core dimension list> ")"
<Core dimension list>  ::= nil | <Dimension name> |
                           <Dimension name> "," <Core dimension list>
<Dimension name>       ::= valid Python variable name

टिप्पणियाँ:

  1. सभी उद्धरण स्पष्टता के लिए हैं।
  2. मुख्य आयाम जो समान नाम साझा करते हैं, उनका सटीक आकार समान होना चाहिए। प्रत्येक आयाम नाम आमतौर पर प्राथमिक फ़ंक्शन के कार्यान्वयन में एक स्तर के लूपिंग से मेल खाता है।
  3. सफेद स्थानों की अनदेखी की जाती है।

यहाँ हस्ताक्षर के कुछ उदाहरण दिए गए हैं:

जोड़ना (),()->()
inner1d (i),(i)->()
sum1d (i)->()
dot2d (m,n),(n,p)->(m,p) मैट्रिक्स गुणन
बाहरी अंदरूनी (i,t),(j,t)->(i,j) अंतिम आयाम पर आंतरिक, दूसरे से अंतिम तक बाहरी, और बाकी हिस्सों पर लूप / प्रसारण।

प्राथमिक कार्य को लागू करने के लिए सी-एपीआई

वर्तमान इंटरफ़ेस अपरिवर्तित रहता है, और PyUFunc_FromFuncAndData अभी भी स्केलर प्राथमिक कार्यों से मिलकर (विशेष) ufuncs को लागू करने के लिए इस्तेमाल किया जा सकता है।

एक अधिक सामान्य ufunc घोषित करने के लिए एक PyUFunc_FromFuncAndDataAndSignature का उपयोग कर सकता है। तर्क सूची PyUFunc_FromFuncAndData के समान है, अतिरिक्त तर्क के साथ C स्ट्रिंग पर हस्ताक्षर निर्दिष्ट करता है।

इसके अलावा, कॉलबैक फ़ंक्शन पहले की तरह ही है, void (*foo)(char **args, intp *dimensions, intp *steps, void *func) । जब आह्वान किया जाता है, तो nargs लंबाई की एक सूची nargs जिसमें सभी इनपुट / आउटपुट तर्कों के डेटा होते हैं। एक अदिश प्रारंभिक कार्य के लिए, steps लंबाई के nargs भी nargs , तर्कों के लिए उपयोग किए गए nargs को दर्शाते हुए। dimensions एक पूर्णांक के लिए एक संकेतक है जो अक्ष के आकार को परिभाषित करता है जिसे ओवर लूप किया जाता है।

एक गैर-तुच्छ हस्ताक्षर के लिए, dimensions में मुख्य आयामों के आकार भी शामिल होंगे, दूसरी प्रविष्टि पर शुरू होगा। प्रत्येक अद्वितीय आयाम नाम के लिए केवल एक आकार प्रदान किया जाता है और हस्ताक्षर में आयाम नाम की पहली घटना के अनुसार आकार दिए जाते हैं।

steps पहले nargs तत्व स्केलर ufuncs के लिए समान रहते हैं। निम्नलिखित तत्वों के क्रम में सभी तर्कों के लिए सभी मुख्य आयामों के तार समाहित हैं।

उदाहरण के लिए, हस्ताक्षर (i,j),(i)->() साथ एक ufunc पर विचार करें। इस स्थिति में, args में इनपुट / आउटपुट सरणियों a , b , c के डेटा में तीन args होंगे। इसके अलावा, dimensions लूप के N के आकार और I और J के मुख्य आयाम i और j के आकार को परिभाषित करने के लिए [N, I, J] । अंत में, steps [a_N, b_N, c_N, a_i, a_j, b_i] , जिसमें सभी चरण शामिल होंगे।