python - Cython में np.int, np.int_, int, और np.int_t के बीच का अंतर?



numpy (2)

यह थोड़ा जटिल है क्योंकि संदर्भ के आधार पर नामों के विभिन्न अर्थ हैं।

int

  1. पायथन में

    int आमतौर पर सिर्फ एक पायथन प्रकार है, यह मनमाने ढंग से सटीक है, जिसका अर्थ है कि आप उसमें किसी भी कल्पनीय पूर्णांक को स्टोर कर सकते हैं (जब तक आपके पास पर्याप्त मेमोरी हो)।

    >>> int(10**50)
    100000000000000000000000000000000000000000000000000
  2. हालाँकि, जब आप इसे एक NumPy सरणी के लिए dtype के रूप में उपयोग करते हैं, तो यह np.int_ 1 के रूप में व्याख्या की जाएगी। जो मनमाने ढंग से सटीक नहीं है, इसका सी आकार long :

    >>> np.array(10**50, dtype=int)
    OverflowError: Python int too large to convert to C long

    इसका भी मतलब है कि निम्नलिखित दो समकक्ष हैं:

    np.array([1,2,3], dtype=int)
    np.array([1,2,3], dtype=np.int_)
  3. Cython प्रकार पहचानकर्ता के रूप में इसका एक और अर्थ है, यहां यह सी प्रकार int । यह सीमित परिशुद्धता (आमतौर पर 32bits) का है आप इसे सिथन प्रकार के रूप में उपयोग कर सकते हैं, उदाहरण के लिए, जब चर के साथ cdef परिभाषित cdef :

    cdef int value = 100    # variable
    cdef int[:] arr = ...   # memoryview

    cdef या cpdef फ़ंक्शंस के लिए वापसी मान या तर्क मान के रूप में:

    cdef int my_function(int argument1, int argument2):
        # ...

    ndarray लिए "सामान्य" के रूप में:

    cimport numpy as cnp
    cdef cnp.ndarray[int, ndim=1] val = ...

    प्रकार कास्टिंग के लिए:

    avalue = <int>(another_value)

    और शायद कई और अधिक

  4. सिथन में लेकिन पायथन प्रकार के रूप में आप अभी भी int कॉल कर सकते हैं और आप एक "पायथन इंट" ( isinstance शुद्धता का) प्राप्त कर सकते हैं, या इसका इस्तेमाल के लिए या dtype लिए np.array तर्क के रूप में उपयोग कर np.array । यहां संदर्भ महत्वपूर्ण है, इसलिए एक पायथन int में कनवर्ट करने से सी इंट में बदलने से अलग है:

    cdef object val = int(10)  # Python int
    cdef int val = <int>(10)   # C int

np.int

दरअसल यह बहुत आसान है। यह केवल int लिए एक उपनाम है:

>>> int is np.int
True

तो ऊपर से सब कुछ np.int पर भी लागू होता है। हालांकि आप इसे एक प्रकार पहचानकर्ता के रूप में उपयोग नहीं कर सकते, सिवाय इसके कि जब आप इसे cimport एड पैकेज पर उपयोग करेंगे। उस स्थिति में यह पायथन पूर्णांक प्रकार का प्रतिनिधित्व करता है।

cimport numpy as cnp

cpdef func(cnp.int obj):
    return obj

यह obj को एक पायथन पूर्णांक होने की उम्मीद नहीं करता है, यह एक NumPy प्रकार नहीं है :

>>> func(np.int_(10))
TypeError: Argument 'obj' has incorrect type (expected int, got numpy.int32)
>>> func(10)
10

np.int बारे में मेरी सलाह: जब भी संभव हो तब से बचें। पायथन कोड में यह int के बराबर है और Cython कोड में यह पायथन int समतुल्य है, लेकिन यदि टाइप-आइडेंटिफ़ायर के रूप में उपयोग किया जाता है तो यह संभवतः आपको और हर कोई जो कोड पढ़ता है, को भ्रमित करेगा! यह निश्चित रूप से मुझे उलझन में ...

np.int_

वास्तव में इसका केवल एक अर्थ है: यह एक पायथन प्रकार है जो एक स्केलर NumPy प्रकार का प्रतिनिधित्व करता है। आप इसे पायथन इंटर की तरह उपयोग करते हैं:

>>> np.int_(10)        # looks like a normal Python integer
10
>>> type(np.int_(10))  # but isn't (output may vary depending on your system!)
numpy.int32

या आप इसका उपयोग dtype को निर्दिष्ट करने के लिए करते हैं, उदाहरण के लिए np.array साथ:

>>> np.array([1,2,3], dtype=np.int_)
array([1, 2, 3])

लेकिन आप इसे Cython में टाइप-आइडेंटिफ़ायर के रूप में उपयोग नहीं कर सकते

cnp.int_t

यह np.int_ के लिए प्रकार-पहचानकर्ता संस्करण है इसका मतलब है कि आप इसे डिपे तर्क के रूप में उपयोग नहीं कर सकते लेकिन आप इसे cdef घोषणाओं के प्रकार के रूप में उपयोग कर सकते हैं:

cimport numpy as cnp
import numpy as np

cdef cnp.int_t[:] arr = np.array([1,2,3], dtype=np.int_)
     |---TYPE---|                         |---DTYPE---|

यह उदाहरण (उम्मीद है) दिखाता है कि टाइपिंग के साथ टाइप-आइडेंटिफ़ायर वास्तव में डीटीपी का उपयोग करते हुए पीछे के बिना एक सरणी के प्रकार को दर्शाता t । आप Cython कोड में उन्हें विनिमय नहीं कर सकते!

टिप्पणियाँ

NumPy में कई अधिक संख्यात्मक प्रकार हैं I में NumPy dtype और Cython टाइप-आइडेंटिफ़ायर और सी टाइप आइडेंटिफ़ायर युक्त सूची शामिल होगी जो यहां Cython में भी उपयोग की जा सकती है। लेकिन यह मूल रूप से pxd प्रलेखन और Cython NumPy pxd फ़ाइल से लिया गया है :

NumPy dtype          Numpy Cython type         C Cython type identifier

np.bool_             None                      None
np.int_              cnp.int_t                 long
np.intc              None                      int       
np.intp              cnp.intp_t                ssize_t
np.int8              cnp.int8_t                signed char
np.int16             cnp.int16_t               signed short
np.int32             cnp.int32_t               signed int
np.int64             cnp.int64_t               signed long long
np.uint8             cnp.uint8_t               unsigned char
np.uint16            cnp.uint16_t              unsigned short
np.uint32            cnp.uint32_t              unsigned int
np.uint64            cnp.uint64_t              unsigned long
np.float_            cnp.float64_t             double
np.float32           cnp.float32_t             float
np.float64           cnp.float64_t             double
np.complex_          cnp.complex128_t          double complex
np.complex64         cnp.complex64_t           float complex
np.complex128        cnp.complex128_t          double complex

असल में वहाँ np.bool_ : cnp.npy_bool और bint लिए Cython प्रकार हैं, लेकिन ये दोनों वर्तमान में NumPy arrays के लिए उपयोग नहीं किए जा सकते हैं। स्केलर cnp.npy_bool लिए सिर्फ एक अहस्ताक्षरित पूर्णांक होगा, जबकि bint एक बूलियन होगा। सुनिश्चित नहीं है कि वहां क्या हो रहा है ...

1 NumPy प्रलेखन से लिया गया "डेटा प्रकार ऑब्जेक्ट्स"

अंतर्निहित पायथन प्रकार

कई अजगर प्रकार संबंधित ऑरे स्केलर के समतुल्य होते हैं जब डीटीईपी ऑब्जेक्ट उत्पन्न करने के लिए प्रयोग किया जाता है:

int           np.int_
bool          np.bool_
float         np.float_
complex       np.cfloat
bytes         np.bytes_
str           np.bytes_ (Python2) or np.unicode_ (Python3)
unicode       np.unicode_
buffer        np.void
(all others)  np.object_

मैं cython में इतने सारे int डेटा प्रकारों के साथ थोड़ा संघर्ष कर रहा हूं I

np.int, np.int_, np.int_t, int

मुझे लगता है कि शुद्ध अजगर में int np.int_ बराबर है, फिर np.int कहां से आता है? मुझे डॉक्यूपी से दस्तावेज़ नहीं मिल रहा है? इसके अलावा, क्यों np.int_ अस्तित्व में है हम पहले से ही int ?

Cython में, मुझे लगता है कि int एक सी प्रकार बन जाता है जब cdef int या cdef int ndarray[int] रूप में इस्तेमाल किया जाता है, और जब यह int() रूप में इस्तेमाल किया जाता है तो यह अजगर ढलाईकार के रूप में रहता है?

सी में long बराबर है np.int_ ? तो cdef long cdef np.int_ के समान है?

क्या np.int_t बजाय np.int_t बजाय मुझे किस परिस्थिति में उपयोग करना चाहिए? जैसे cdef np.int_t , ndarray[np.int_t] ...

क्या कोई संक्षेप में बता सकता है कि उन प्रकार के गलत इस्तेमाल से संकलित साइथॉन कोड के प्रदर्शन को कैसे प्रभावित होगा?


np.int_ डिफ़ॉल्ट पूर्णांक प्रकार है ( NumPy डॉक्स में परिभाषित ), एक 64 बिट सिस्टम पर यह एक C long होगा np.intc डिफ़ॉल्ट C int या तो int32 या int64 np.int अंतर्निहित int फ़ंक्शन के लिए एक उपनाम है

>>> np.int(2.4)
2
>>> np.int is int  # object id equality
True

Cython डेटाटाइप C डेटाटाइप को प्रतिबिंबित करना चाहिए, इसलिए cdef int a एक C int और इसी तरह है।

के रूप में np.int_t लिए है कि Cython संकलन समय NumPy np.int_ डेटाटाइप के बराबर है, np.int64_t Cython compile समय np.int64 समतुल्य है





cython