NumPy 1.14 - UFUNC_ERR_{HANDLER}

यूएफएनसी एपीआई




numpy

यूएफएनसी एपीआई

स्थिरांक

UFUNC_ERR_{HANDLER}

{HANDLER} IGNORE , WARN , RAISE , या CALL हो सकता है

UFUNC_{THING}_{ERR}

{THING} MASK , SHIFT या FPE हो सकता है , और {ERR} DIVIDEBYZERO , OVERFLOW , UNDERFLOW और INVALID हो सकता है

PyUFunc_{VALUE}

{VALUE} एक (1), शून्य (0), या कोई नहीं (-1) हो सकता है

मैक्रो

NPY_LOOP_BEGIN_THREADS

केवल लूप-> obj सच नहीं है ( यानी यह एक OBJECT सरणी लूप नहीं है) पायथन जीआईएल को रिलीज करने के लिए सार्वभौमिक फ़ंक्शन कोड में उपयोग किया जाता है। चर घोषणा क्षेत्र में NPY_BEGIN_THREADS_DEF उपयोग की आवश्यकता है।

NPY_LOOP_END_THREADS

यदि इसे जारी किया गया था (क्योंकि लूप-> obj सच नहीं था) फिर से पायथन जीआईएल को प्राप्त करने के लिए सार्वभौमिक फ़ंक्शन कोड में उपयोग किया जाता है।

UFUNC_CHECK_ERROR(loop)

एक मैक्रो आंतरिक रूप से त्रुटियों की जांच करने के लिए उपयोग किया जाता है और यदि मिला तो असफल हो जाता है। इस मैक्रो को वर्तमान कोड ब्लॉक में एक असफल लेबल की आवश्यकता होती है। लूप वेरिएबल में कम से कम सदस्य (obj, इरोरमास्क और एरोबोब) होने चाहिए। यदि लूप -> PyErr_Occurred , तो PyErr_Occurred () कहा जाता है (जिसका अर्थ है GIL आयोजित होना चाहिए)। यदि लूप -> ओब्ज शून्य है, तो यदि लूप -> इरोमैस्कोक नॉनजेरो है, तो PyUFunc_checkfperr को तर्कों के साथ लूप -> इरोरमास्क और लूप -> एरोबज कहा जाता है। यदि IEEE फ़्लोटिंग पॉइंट रजिस्टरों के इस चेक का परिणाम सही है, तो कोड विफल लेबल पर रीडायरेक्ट करता है जिसे परिभाषित किया जाना चाहिए।

UFUNC_CHECK_STATUS(ret)

पदावनत: बजाय npy_math.h से npy_clear_floatstatus का उपयोग करें।

एक मैक्रो जो प्लेटफ़ॉर्म-निर्भर कोड तक फैलता है। रिट चर किसी भी पूर्णांक हो सकता है। UFUNC_FPE_{ERR} बिट्स को फ़्लोटिंग पॉइंट प्रोसेसर के संबंधित त्रुटि झंडे की स्थिति के अनुसार सेट किया गया है।

कार्य

PyObject* PyUFunc_FromFuncAndData(PyUFuncGenericFunction* func, void** data, char* types, int ntypes, int nin, int nout, int identity, char* name, char* doc, int unused)

आवश्यक चर से एक नया प्रसारण सार्वभौमिक समारोह बनाएँ। प्रत्येक ufunc एक तत्व-दर-तत्व ऑपरेशन की धारणा के आसपास बनाता है। प्रत्येक ufunc ऑब्जेक्ट में प्रत्येक समर्थित प्रकार के लिए बुनियादी कार्यक्षमता को लागू करने वाले 1-d छोरों के संकेत होते हैं।

ध्यान दें

कवक , डेटा , प्रकार , नाम , और डॉक्टर के तर्क PyUFunc_FromFuncAndData द्वारा कॉपी नहीं किए PyUFunc_FromFuncAndData । कॉलर को यह सुनिश्चित करना चाहिए कि इन सरणियों द्वारा उपयोग की जाने वाली मेमोरी को मुक्त नहीं किया जाता है जब तक कि ufunc ऑब्जेक्ट जीवित है।

पैरामीटर:
  • func - PyUFuncGenericFunction आइटम वाले लंबाई वाले PyUFuncGenericFunction की एक सरणी के लिए होना चाहिए। ये आइटम उन फ़ंक्शन के लिए संकेत हैं जो वास्तव में अंतर्निहित (तत्व-बाय-एलिमेंट) फ़ंक्शन को लागू करते हैं एन बार।
  • डेटा - आकार ntypes की एक सरणी के लिए NULL या पॉइंटर होना चाहिए। इस सरणी में फ़नक सरणी में संबंधित 1-डी लूप फ़ंक्शन को पारित करने के लिए मनमाना अतिरिक्त डेटा हो सकता है।
  • प्रकार - लंबाई ( निन + न्यूट ) * ntypes होना चाहिए, और इसमें डेटा-प्रकार (बिल्ट-इन केवल) शामिल है जो कि फंक ऐरे में संबंधित फ़ंक्शन से निपट सकते हैं।
  • ntypes - ufunc ने कितने अलग-अलग डेटा-प्रकार "हस्ताक्षर" लागू किए हैं।
  • नौ - इस ऑपरेशन के इनपुट की संख्या।
  • nout - आउटपुट की संख्या
  • नाम - ufunc के लिए नाम। 'ऐड' या 'गुणा' के नाम को निर्दिष्ट करना पूर्णांक-टाइप किए गए कटौती के लिए एक विशेष व्यवहार को सक्षम करता है जब कोई dtype नहीं दिया जाता है। यदि इनपुट प्रकार एक पूर्णांक (या बूलियन) डेटा प्रकार है जो int_ डेटा प्रकार के आकार से छोटा है, तो यह आंतरिक रूप से int_ (या uint) डेटा प्रकार के लिए int_
  • डॉक्टर - एक प्रलेखन स्ट्रिंग में ufunc के साथ संग्रहीत करने की अनुमति देता है। दस्तावेज़ीकरण स्ट्रिंग में फ़ंक्शन का नाम या कॉलिंग हस्ताक्षर नहीं होना चाहिए क्योंकि यह गतिशील रूप से ऑब्जेक्ट से निर्धारित किया जाएगा और ufdc की __doc__ विशेषता तक पहुंचते समय उपलब्ध होगा।
  • अप्रयुक्त - अप्रयुक्त और सी-एपीआई के पीछे की संगतता के लिए मौजूद है।
PyObject* PyUFunc_FromFuncAndDataAndSignature(PyUFuncGenericFunction* func, void** data, char* types, int ntypes, int nin, int nout, int identity, char* name, char* doc, int unused, char *signature)

यह फ़ंक्शन ऊपर PyUFunc_FromFuncAndData के समान है, लेकिन सामान्यीकृत सार्वभौमिक कार्यों को परिभाषित करने के लिए एक अतिरिक्त हस्ताक्षर तर्क है। इसी तरह एक तत्व-दर-तत्व ऑपरेशन के चारों ओर ufuncs कैसे बनाए जाते हैं, gufuncs सबर्रे-बाय-सबएरे ऑपरेशन के आसपास होते हैं, हस्ताक्षर उप-संचालन को परिभाषित करने के लिए।

पैरामीटर:
  • हस्ताक्षर - नए gufunc के लिए हस्ताक्षर। इसे NULL पर सेट करना PyUFunc_FromFuncAndData को कॉल करने के बराबर है। स्ट्रिंग की एक प्रति बनाई गई है, इसलिए बफर में पारित को मुक्त किया जा सकता है।
int PyUFunc_RegisterLoopForType(PyUFuncObject* ufunc, int usertype, PyUFuncGenericFunction function, int* arg_types, void* data)

यह फ़ंक्शन उपयोगकर्ता को पहले से बनाए गए ufunc के साथ 1-d लूप को पंजीकृत करने की अनुमति देता है जब भी उपयोगकर्ता-परिभाषित डेटा-प्रकार के रूप में ufunc को इसके किसी भी इनपुट तर्क के साथ बुलाया जाता है। अंतर्निहित डेटा-प्रकारों के साथ ufuncs को काम करने के लिए इसकी आवश्यकता होती है। डेटा-प्रकार पहले से खस्ता प्रणाली के साथ पंजीकृत होना चाहिए। लूप को फ़ंक्शन के रूप में पारित किया जाता है । यह लूप मनमाना डेटा ले सकता है जिसे डेटा के रूप में पास किया जाना चाहिए। डेटा प्रकार के लूप की आवश्यकता होती है जिसे arg_types के रूप में पास किया जाता है जो कि कम से कम ufunc-> नर्ग के रूप में बड़े होने के लिए स्मृति के लिए एक संकेतक होना चाहिए।

int PyUFunc_RegisterLoopForDescr(PyUFuncObject* ufunc, PyArray_Descr* userdtype, PyUFuncGenericFunction function, PyArray_Descr** arg_dtypes, void* data)

यह फ़ंक्शन उपरोक्त Py Pyununc_RegisterLoopForType की तरह व्यवहार करता है, सिवाय इसके कि यह उपयोगकर्ता को dtype type num मानों के बजाय PyArray_Descr ऑब्जेक्ट का उपयोग करके 1-d लूप पंजीकृत करने की अनुमति देता है। यह स्केलर डेटा-प्रकारों के बजाय संरचित सरणी डेटा-dtypes और कस्टम डेटा-प्रकारों के लिए 1-डी लूप को पंजीकृत करने की अनुमति देता है।

int PyUFunc_ReplaceLoopBySignature(PyUFuncObject* ufunc, PyUFuncGenericFunction newfunc, int* signature, PyUFuncGenericFunction* oldfunc)

1-d लूप को पहले से बनाए गए ufunc में दिए गए सिग्नेचर को नए 1-d लूप newfunc से बदलें। Oldfunc में पुराने 1-d लूप फ़ंक्शन को लौटाएं । सफलता पर 0 और विफलता पर -1। यह फ़ंक्शन केवल अंतर्निहित प्रकारों के साथ काम करता है (उपयोगकर्ता-परिभाषित प्रकारों के लिए PyUFunc_RegisterLoopForType उपयोग करें)। एक हस्ताक्षर डेटा-प्रकार की संख्याओं का एक सरणी है जो 1-डी लूप द्वारा ग्रहण किए गए आउटपुट द्वारा पीछा किए गए इनपुट को दर्शाता है।

int PyUFunc_GenericFunction(PyUFuncObject* self, PyObject* args, PyObject* kwds, PyArrayObject** mps)

एक सामान्य ufunc कॉल। Ufunc स्वयं के रूप में पारित किया जाता है, args और kwds के रूप में ufunc के तर्क। PyArrayObject का तर्क PyArrayObject पॉइंटर्स की एक सरणी है, जिनके मानों को छोड़ दिया गया है और जो परिवर्तित इनपुट तर्कों के साथ-साथ ufunc आउटपुट प्राप्त करते हैं जब सफलता वापस आ जाती है। उपयोगकर्ता इस सरणी को प्रबंधित करने के लिए ज़िम्मेदार है और mps में प्रत्येक सरणी के लिए एक नया संदर्भ प्राप्त करता है। Mps में सरणियों की कुल संख्या स्व -> नि + स्व -> नाउट द्वारा दी गई है।

सफलता पर 0, त्रुटि पर -1 देता है।

int PyUFunc_checkfperr(int errmask, PyObject* errobj)

IEEE त्रुटि-ध्वज जाँच समर्थन के लिए एक सरल इंटरफ़ेस। इरमास्क तर्क, UFUNC_MASK_{ERR} बिटकॉइन का एक मुखौटा है जो यह बताता है कि कौन सी त्रुटियों की जांच करनी है (और उनके लिए कैसे जांच की जाए)। एरोबेज में दो तत्वों वाला पायथन टपल होना चाहिए: एक स्ट्रिंग जिसमें नाम का उपयोग त्रुटि के किसी भी संचार में किया जाएगा और या तो एक कॉलिबल पायथन ऑब्जेक्ट (कॉल-बैक फ़ंक्शन) या Py_None UFUNC_ERR_CALL योग्य ऑब्जेक्ट का उपयोग केवल तभी किया जाएगा जब UFUNC_ERR_CALL वांछित त्रुटि जाँच विधि के रूप में सेट किया गया हो। यह रूटीन GIL का प्रबंधन करता है और GIL जारी करने के बाद भी कॉल करने के लिए सुरक्षित है। यदि IEEE- संगत हार्डवेयर में कोई त्रुटि निर्धारित की जाती है -1 लौटा दी जाती है, अन्यथा 0 वापस लौटा दी जाती है।

void PyUFunc_clearfperr()

IEEE त्रुटि झंडे साफ़ करें।

void PyUFunc_GetPyValues(char* name, int* bufsize, int* errmask, PyObject** errobj)

धागा-स्थानीय भंडारण क्षेत्र से ufunc प्रसंस्करण के लिए उपयोग किए जाने वाले पायथन मूल्यों को प्राप्त करें, जब तक कि चूक को सेट नहीं किया जाता है, जब तक कि नाम लुकअप को बाईपास नहीं किया जाता है। नाम को पहले एरोबज * के पहले तत्व में एक स्ट्रिंग के रूप में रखा गया है। दूसरा तत्व त्रुटि कॉलबैक पर कॉल करने के लिए देखा गया फ़ंक्शन है। उपयोग किए जाने वाले बफर-आकार के मूल्य को bufsize में पास किया जाता है , और त्रुटि मास्क के मूल्य को इरमास्क में रखा जाता है।

सामान्य कार्य

हर ufunc के मूल में विशिष्ट प्रकार के कार्यों का एक संग्रह होता है जो प्रत्येक समर्थित प्रकार के लिए बुनियादी कार्यक्षमता को परिभाषित करता है। इन फ़ंक्शन को अंतर्निहित फ़ंक्शन का मूल्यांकन करना होगा एन \ geq1 बार। गणना के दौरान अतिरिक्त-डेटा का उपयोग किया जा सकता है। यह सुविधा कुछ सामान्य कार्यों को इन बुनियादी लूपिंग कार्यों के रूप में उपयोग करने की अनुमति देती है। सामान्य फ़ंक्शन में चर को सही स्थान पर इंगित करने और फ़ंक्शन कॉल सेट करने के लिए आवश्यक सभी कोड होते हैं। सामान्य फ़ंक्शन मानता है कि कॉल करने के लिए वास्तविक फ़ंक्शन को अतिरिक्त डेटा के रूप में पारित किया गया है और इसे सही मानों के साथ कॉल करता है। ये सभी कार्य PyUFuncObject संरचना के फ़ंक्शन सदस्य में संग्रहीत कार्यों की सरणी में सीधे रखने के लिए उपयुक्त हैं।

void PyUFunc_f_f_As_d_d(char** args, npy_intp* dimensions, npy_intp* steps, void* func)
void PyUFunc_d_d(char** args, npy_intp* dimensions, npy_intp* steps, void* func)
void PyUFunc_f_f(char** args, npy_intp* dimensions, npy_intp* steps, void* func)
void PyUFunc_g_g(char** args, npy_intp* dimensions, npy_intp* steps, void* func)
void PyUFunc_F_F_As_D_D(char** args, npy_intp* dimensions, npy_intp* steps, void* func)
void PyUFunc_F_F(char** args, npy_intp* dimensions, npy_intp* steps, void* func)
void PyUFunc_D_D(char** args, npy_intp* dimensions, npy_intp* steps, void* func)
void PyUFunc_G_G(char** args, npy_intp* dimensions, npy_intp* steps, void* func)
void PyUFunc_e_e(char** args, npy_intp* dimensions, npy_intp* steps, void* func)
void PyUFunc_e_e_As_f_f(char** args, npy_intp* dimensions, npy_intp* steps, void* func)
void PyUFunc_e_e_As_d_d(char** args, npy_intp* dimensions, npy_intp* steps, void* func)

टाइप करें विशिष्ट, कोर 1-डी कार्यों के लिए यूफंक्स जहां प्रत्येक गणना एक इनपुट लॉजिक लेने वाले फ़ंक्शन को कॉल करके और एक आउटपुट लौटाता है। यह फ़ंक्शन func में पारित किया गया है। पत्र dtypechar के समर्थित डेटा प्रकारों ( e - half, f - float, d - double, g - long double, F - cfloat, D - cdouble, G - clongdouble) के अनुरूप हैं। तर्क कवक को उसी हस्ताक्षर का समर्थन करना चाहिए। _As_X_X वेरिएंट एक डेटा प्रकार के ndarray मान लेते हैं, लेकिन एक अंतर्निहित फ़ंक्शन का उपयोग करने के लिए मान डालते हैं जो एक अलग डेटा प्रकार लेता है। इस प्रकार, PyUFunc_f_f_As_d_d डेटा प्रकार NPY_FLOAT की PyUFunc_f_f_As_d_d का उपयोग करता है, लेकिन एक C- फ़ंक्शन को कॉल करता है जो डबल लेता है और डबल रिटर्न करता है।

void PyUFunc_ff_f_As_dd_d(char** args, npy_intp* dimensions, npy_intp* steps, void* func)
void PyUFunc_ff_f(char** args, npy_intp* dimensions, npy_intp* steps, void* func)
void PyUFunc_dd_d(char** args, npy_intp* dimensions, npy_intp* steps, void* func)
void PyUFunc_gg_g(char** args, npy_intp* dimensions, npy_intp* steps, void* func)
void PyUFunc_FF_F_As_DD_D(char** args, npy_intp* dimensions, npy_intp* steps, void* func)
void PyUFunc_DD_D(char** args, npy_intp* dimensions, npy_intp* steps, void* func)
void PyUFunc_FF_F(char** args, npy_intp* dimensions, npy_intp* steps, void* func)
void PyUFunc_GG_G(char** args, npy_intp* dimensions, npy_intp* steps, void* func)
void PyUFunc_ee_e(char** args, npy_intp* dimensions, npy_intp* steps, void* func)
void PyUFunc_ee_e_As_ff_f(char** args, npy_intp* dimensions, npy_intp* steps, void* func)
void PyUFunc_ee_e_As_dd_d(char** args, npy_intp* dimensions, npy_intp* steps, void* func)

टाइप करें विशिष्ट, कोर 1-डी फंक्शंस के लिए जहां प्रत्येक गणना दो इनपुट तर्कों को लेने वाले फ़ंक्शन को कॉल करके और एक आउटपुट लौटाता है। कॉल करने के लिए अंतर्निहित फ़ंक्शन को फंक के रूप में पारित किया गया है। पत्र सामान्य उद्देश्य फ़ंक्शन द्वारा समर्थित विशिष्ट डेटा प्रकार के dtypechar के अनुरूप हैं। तर्क func को संबंधित हस्ताक्षर का समर्थन करना चाहिए। _As_XX_X वेरिएंट एक डेटा प्रकार की ndarrays मान लेते हैं, लेकिन अंतर्निहित फ़ंक्शन का उपयोग करने के लिए लूप के प्रत्येक पुनरावृत्ति पर मान डालते हैं जो एक अलग डेटा प्रकार लेता है।

void PyUFunc_O_O(char** args, npy_intp* dimensions, npy_intp* steps, void* func)
void PyUFunc_OO_O(char** args, npy_intp* dimensions, npy_intp* steps, void* func)

NPY_OBJECT डेटा प्रकार के लिए एक-इनपुट, एक-आउटपुट और दो-इनपुट, एक-आउटपुट कोर 1-d फ़ंक्शन। ये फ़ंक्शन संदर्भ गणना समस्याओं को संभालते हैं और त्रुटि पर जल्दी लौटते हैं। कॉल करने के लिए वास्तविक फ़ंक्शन (PyObject*) (PyObject*) और इसे (PyObject*) (PyObject*) लिए PyUFunc_O_O या (PyObject*)(PyObject *, PyObject *) लिए हस्ताक्षर (PyObject*) (PyObject*) के साथ कॉल स्वीकार करना होगा।

void PyUFunc_O_O_method(char** args, npy_intp* dimensions, npy_intp* steps, void* func)

यह सामान्य उद्देश्य 1-डी कोर फ़ंक्शन मानता है कि कवक एक स्ट्रिंग है जो इनपुट ऑब्जेक्ट की एक विधि का प्रतिनिधित्व करता है। लूप के प्रत्येक पुनरावृत्ति के लिए, पायथन ऑब्जेक्ट को एरे से निकाला जाता है और इसकी फंक विधि को आउटपुट एरे में परिणाम कहा जाता है।

void PyUFunc_OO_O_method(char** args, npy_intp* dimensions, npy_intp* steps, void* func)

यह सामान्य उद्देश्य 1-डी कोर फ़ंक्शन मानता है कि कवक एक स्ट्रिंग है जो इनपुट ऑब्जेक्ट की एक विधि का प्रतिनिधित्व करता है जो एक तर्क लेता है। आर्ग्स में पहला तर्क वह विधि है जिसका फ़ंक्शन कहा जाता है, आर्ग्स में दूसरा तर्क फ़ंक्शन के लिए दिया गया तर्क है। फंक्शन का आउटपुट आर्ग्स की तीसरी एंट्री में स्टोर होता है।

void PyUFunc_On_Om(char** args, npy_intp* dimensions, npy_intp* steps, void* func)

यह 1-d कोर फ़ंक्शन है जिसका उपयोग umath.frompyfunc (फ़ंक्शन, निन, नाउट) द्वारा बनाए गए गतिशील ufuncs द्वारा किया जाता है। इस मामले में func एक PyUFunc_PyFuncData संरचना का सूचक है जिसकी परिभाषा है

PyUFunc_PyFuncData
typedef struct {
    int nin;
    int nout;
    PyObject *callable;
} PyUFunc_PyFuncData;

लूप के प्रत्येक पुनरावृत्ति पर, नौ इनपुट ऑब्जेक्ट्स को उनके ऑब्जेक्ट सरणियों से निकाला जाता है और एक तर्क ट्यूपल में रखा जाता है, पायथन कॉलेबल को इनपुट तर्कों के साथ कहा जाता है, और नाउट आउटपुट को उनके ऑब्जेक्ट सरणियों में रखा जाता है।

एपीआई आयात कर रहा है

PY_UFUNC_UNIQUE_SYMBOL
NO_IMPORT_UFUNC
void import_ufunc(void)

ये स्थिरांक C-API तक पहुँचने के लिए स्थिरांक और फ़ंक्शंस हैं, जो विस्तार मॉड्यूल से ठीक उसी तरह से हैं जैसे कि C-API तक पहुँचा जा सकता है। import_ufunc () फ़ंक्शन को हमेशा कहा जाना चाहिए (विस्तार मॉड्यूल के आरंभिक सबरूटीन में)। यदि आपका एक्सटेंशन मॉड्यूल एक फ़ाइल में है, तो वह सब आवश्यक है। यदि आपके एक्सटेंशन मॉड्यूल कई फ़ाइलों का उपयोग करते हैं तो अन्य दो स्थिरांक उपयोगी होते हैं। उस स्थिति में, PY_UFUNC_UNIQUE_SYMBOL को आपके कोड के लिए कुछ अद्वितीय और फिर स्रोत फ़ाइलों में परिभाषित करें, जिसमें मॉड्यूल इनिशियलाइज़ेशन फ़ंक्शन शामिल नहीं है, लेकिन फिर भी UFUNC API तक पहुँच की आवश्यकता होती है, पहले उपयोग किए गए समान नाम PY_UFUNC_UNIQUE_SYMBOL को परिभाषित करें और PY_UFUNC_UNIQUE_SYMBOL को परिभाषित NO_IMPORT_UFUNC

C-API वास्तव में फ़ंक्शन पॉइंटर्स की एक सरणी है। यह सरणी import_ufunc द्वारा बनाई गई है (और एक वैश्विक चर द्वारा इंगित की गई है)। वैश्विक चर या तो PY_UFUNC_UNIQUE_SYMBOL और NO_IMPORT_UFUNC की स्थिति के आधार पर अन्य फ़ाइलों द्वारा देखा जा सकता है।