अजगर में संख्यात्मक प्रकार की पहचान कैसे करें?


100

यदि कोई वस्तु एक सुन्न प्रकार की है तो कोई कैसे निश्चित रूप से निर्धारित कर सकता है?

मुझे एहसास है कि यह प्रश्न बतख टाइपिंग के दर्शन के खिलाफ जाता है, लेकिन विचार यह सुनिश्चित करने के लिए है कि एक फ़ंक्शन (जो थपकी और सुन्न का उपयोग करता है) कभी भी एक खस्ता प्रकार नहीं लौटाता है जब तक कि इसे एक खस्ता प्रकार के साथ नहीं कहा जाता है। यह एक और प्रश्न के समाधान में आता है, लेकिन मुझे लगता है कि यह निर्धारित करने की सामान्य समस्या है कि क्या किसी वस्तु के पास एक संख्यात्मक प्रकार है जो उस मूल प्रश्न से बहुत दूर है कि उन्हें अलग किया जाना चाहिए।


एक प्रश्न: यदि आप (या, कहते हैं, डरपोक) एक प्रकार को परिभाषित करते हैं जो एक सुन्न प्रकार को उपवर्गित करता है, तो क्या वह गणना होनी चाहिए या नहीं? (मेरा मानना ​​है कि आप पायथन में सुन्न प्रकारों को उप-वर्ग नहीं कर सकते हैं, लेकिन आप C मॉड्यूल में कर सकते हैं, और मुझे लगता है कि आप PyPy में भी numpypy प्रकारों को उप-वर्ग कर सकते हैं ... तो यह शायद कोई फर्क नहीं पड़ता, लेकिन यह समझ से बाहर नहीं हो सकता है।)
बजे

मैंने ऐसा नहीं सोचा था; मूल रूप से आपकी टिप्पणी बताती है कि प्रश्न उम्मीद से अधिक कठिन है। ईमानदारी से उस तरह के उच्च-स्तर पर विचार करना मेरी स्थिति के लिए ओवरकिल है। सामान्य और पोर्टेबल उत्तर के लिए, मैं कहूंगा कि जब तक व्यवहार को परिभाषित किया जाता है तब तक यह ठीक है।
डगलस बी। स्टेपल

जवाबों:


116

typeप्रकार प्राप्त करने के लिए अंतर्निहित फ़ंक्शन का उपयोग करें , फिर आप __module__संपत्ति का उपयोग यह पता लगाने के लिए कर सकते हैं कि यह कहां परिभाषित किया गया था:

>>> import numpy as np
a = np.array([1, 2, 3])
>>> type(a)
<type 'numpy.ndarray'>
>>> type(a).__module__
'numpy'
>>> type(a).__module__ == np.__name__
True

उदाहरण के लिए numpy.ma.MaskedArray एक पर्याप्त पर्याप्त प्रकार नहीं है?
पांडा -34

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

1
छिपी हुई विशेषताओं पर भरोसा करते हुए यह समाधान बहुत ही असाध्य लगता है। लेकिन शायद यह सिर्फ स्वाद की बात है?
j0,000ue

2
@ j0coinue वे छिपी हुई विशेषताएँ नहीं हैं, वे विशेष गुण प्रलेखित हैं। यह, फिर भी, unpythonic है, लेकिन मुझे लगता है कि समस्या में निहित है। (और मुझे लगता है अजगर का एक ताकत है कि जब आप कुछ भाषा हतोत्साहित करना चाहते हैं, सबसे अच्छा समाधान आम तौर पर दिख बदसूरत पर्याप्त है कि आप कुछ सामान्य रूप से एक बुरा विचार है कि कर रहे हैं बाहर कॉल करने के लिए है।)
abarnert

69

जो समाधान मैं लेकर आया हूं वह है:

isinstance(y, (np.ndarray, np.generic) )

हालाँकि, यह 100% स्पष्ट नहीं है कि सभी प्रकार के खट्टे प्रकारों की गारंटी दी जाती है np.ndarrayया np.generic, और यह संभवतः संस्करण मजबूत नहीं है।


1
मुझे लगता है कि आप dir(numpy)प्रकारों और बिल्डिन फ़ंक्शंस (और कक्षाओं पर फ़िल्टर कर सकते हैं, लेकिन मुझे नहीं लगता कि इसमें कोई भी है) और इसका उपयोग करने के लिए एक ट्यूपल को उत्पन्न isinstanceकिया जा सकता है, जो मजबूत होगा। (मेरा मानना ​​है कि आप बिल्टइन फ़ंक्शंस को आइंस्टीन के पास कर सकते हैं कि वे वास्तव में टाइप कंस्ट्रक्टर हैं या नहीं, लेकिन आपको इसकी जाँच करनी होगी।)
abarnert

हां, उन सभी को उन दो AFAIK के उपवर्ग होना चाहिए।
सेबर्ग

@ हर्बर्ग धन्यवाद। यह निश्चित रूप से अभी के लिए मामला लगता है, लेकिन अजगर प्रलेखन इस पर बहुत स्पष्ट नहीं है और यह भविष्य में संभवत: बदल सकता है।
डगलस बी। स्टेपल

19

पुराना सवाल है लेकिन मैं एक उदाहरण के साथ एक निश्चित जवाब के साथ आया हूं। सवालों को ताजा रखने के लिए चोट नहीं पहुंचा सकते क्योंकि मुझे यही समस्या थी और इसका स्पष्ट जवाब नहीं मिला। कुंजी यह सुनिश्चित करने के लिए है कि आपने numpyआयात किया है, और फिर isinstanceबूल चलाएं । हालांकि यह सरल लग सकता है, यदि आप विभिन्न डेटा प्रकारों में कुछ संगणना कर रहे हैं, तो यह छोटी सी जाँच आपके कुछ सुस्पष्ट वेक्टर ऑपरेशन शुरू करने से पहले एक त्वरित परीक्षण के रूप में काम कर सकती है।

##################
# important part!
##################

import numpy as np

####################
# toy array for demo
####################

arr = np.asarray(range(1,100,2))

########################
# The instance check
######################## 

isinstance(arr,np.ndarray)

9

यह वास्तव में आप क्या देख रहे हैं पर निर्भर करता है।

  • यदि आप परीक्षण करना चाहते हैं कि क्या वास्तव में एक अनुक्रम एक है ndarray, एक isinstance(..., np.ndarray)शायद सबसे आसान है। सुनिश्चित करें कि आप पृष्ठभूमि में सुन्न नहीं हैं क्योंकि मॉड्यूल अलग हो सकता है, लेकिन अन्यथा, आपको ठीक होना चाहिए। MaskedArrays, matrix, recarrayके सभी उपवर्गों हैं ndarray, तो आप सेट किया जाना चाहिए।
  • यदि आप परीक्षण करना चाहते हैं कि क्या एक अदिश एक अदिश अदिश राशि है, तो चीजें थोड़ी अधिक जटिल हो जाती हैं। आप देख सकते हैं कि इसमें shapeएक dtypeविशेषता है या नहीं। आप इसकी तुलना dtypeमूल dtypes से कर सकते हैं, जिसकी सूची आप पा सकते हैं np.core.numerictypes.genericTypeRank। ध्यान दें कि इस सूची के तत्व स्ट्रिंग हैं, इसलिए आपको एक करना होगा tested.dtype is np.dtype(an_element_of_the_list)...

+1। यदि आप वास्तव में "एक numpyप्रकार है" के अलावा कुछ खोज रहे हैं , और यह परिभाषित कर सकते हैं कि कुछ क्या है, तो यह अन्य उत्तरों से बेहतर है। और ज्यादातर मामलों में, आपको कुछ विशिष्ट की तलाश होनी चाहिए जिसे आप परिभाषित कर सकते हैं।
गाली

8

प्रकार प्राप्त करने के लिए, अंतर्निहित typeफ़ंक्शन का उपयोग करें । inऑपरेटर के साथ , आप यह जांच कर सकते हैं कि क्या टाइप में एक खसरा प्रकार है या नहीं, अगर यह स्ट्रिंग है numpy;

In [1]: import numpy as np

In [2]: a = np.array([1, 2, 3])

In [3]: type(a)
Out[3]: <type 'numpy.ndarray'>

In [4]: 'numpy' in str(type(a))
Out[4]: True

(यह उदाहरण आईपीथॉन में चलाया गया था , वैसे भी। इंटरैक्टिव उपयोग और त्वरित परीक्षणों के लिए बहुत आसान है।)


2
यह काम करता है, लेकिन यदि आप "numpygroup" नामक एक प्रकार को परिभाषित करते हैं, तो आपको झूठी सकारात्मकता मिलेगी। इसके अलावा, प्रकारों के स्ट्रिंग प्रतिनिधित्व के आधार पर एक बुरा विचार है यदि आप इसे टाल सकते हैं - और इस मामले में, आप कर सकते हैं। इसके बजाय इसके मॉड्यूल को देखें।
अबर्नेट

मॉड्यूल का उपयोग करना वास्तव में एक बेहतर समाधान है।
रोलैंड स्मिथ

रेगेक्स का इस्तेमाल किया जा सकता है
omkaartg

@ Omkaar.K Regex का इस्तेमाल किस लिए किया जा सकता है? थोड़ा और अधिक जटिल तरीके से सटीक जांच करने के लिए?
16

@abamert "क्या" मैंने कहा है, रेगेक्स भी इन जैसे सरल कार्यों के लिए जटिल लग सकता है, लेकिन यह बड़े स्ट्रिंग प्रसंस्करण कार्यों के लिए बेहद उपयोगी है, इसलिए इसे सीखना बुरा नहीं है। मुझे लगता है कि आप जानते हैं कि पहले से ही आपके पोर्टफोलियो ने आपको एक वरिष्ठ प्रोग्रामर के रूप में चित्रित किया है?
omkaartg

3

ध्यान दें कि type(numpy.ndarray)एक typeही है और बूलियन और स्केलर प्रकारों के लिए बाहर देखो। अगर यह सहज या आसान नहीं है, तो निराश मत हो, यह पहली बार में दर्द है।

इसे भी देखें: - https://docs.scipy.org/doc/numpy-1.15.1/reference/arrays.dtypes.html - https://github.com/machinalis/mypy-data/tree/master/numpy- mypy

>>> import numpy as np
>>> np.ndarray
<class 'numpy.ndarray'>
>>> type(np.ndarray)
<class 'type'>
>>> a = np.linspace(1,25)
>>> type(a)
<class 'numpy.ndarray'>
>>> type(a) == type(np.ndarray)
False
>>> type(a) == np.ndarray
True
>>> isinstance(a, np.ndarray)
True

बुलियन के साथ मज़ा:

>>> b = a.astype('int32') == 11
>>> b[0]
False
>>> isinstance(b[0], bool)
False
>>> isinstance(b[0], np.bool)
False
>>> isinstance(b[0], np.bool_)
True
>>> isinstance(b[0], np.bool8)
True
>>> b[0].dtype == np.bool
True
>>> b[0].dtype == bool  # python equivalent
True

स्केलर प्रकारों के साथ अधिक मज़ा, देखें: - https://docs.scipy.org/doc/numpy-1.15.1/reference/arrays.scalars.html#arrays-scalars-built-in

>>> x = np.array([1,], dtype=np.uint64)
>>> x[0].dtype
dtype('uint64')
>>> isinstance(x[0], np.uint64)
True
>>> isinstance(x[0], np.integer)
True  # generic integer
>>> isinstance(x[0], int)
False  # but not a python int in this case

# Try matching the `kind` strings, e.g.
>>> np.dtype('bool').kind                                                                                           
'b'
>>> np.dtype('int64').kind                                                                                          
'i'
>>> np.dtype('float').kind                                                                                          
'f'
>>> np.dtype('half').kind                                                                                           
'f'

# But be weary of matching dtypes
>>> np.integer
<class 'numpy.integer'>
>>> np.dtype(np.integer)
dtype('int64')
>>> x[0].dtype == np.dtype(np.integer)
False

# Down these paths there be dragons:

# the .dtype attribute returns a kind of dtype, not a specific dtype
>>> isinstance(x[0].dtype, np.dtype)
True
>>> isinstance(x[0].dtype, np.uint64)
False  
>>> isinstance(x[0].dtype, np.dtype(np.uint64))
Traceback (most recent call last):
  File "<console>", line 1, in <module>
TypeError: isinstance() arg 2 must be a type or tuple of types
# yea, don't go there
>>> isinstance(x[0].dtype, np.int_)
False  # again, confusing the .dtype with a specific dtype


# Inequalities can be tricky, although they might
# work sometimes, try to avoid these idioms:

>>> x[0].dtype <= np.dtype(np.uint64)
True
>>> x[0].dtype <= np.dtype(np.float)
True
>>> x[0].dtype <= np.dtype(np.half)
False  # just when things were going well
>>> x[0].dtype <= np.dtype(np.float16)
False  # oh boy
>>> x[0].dtype == np.int
False  # ya, no luck here either
>>> x[0].dtype == np.int_
False  # or here
>>> x[0].dtype == np.uint64
True  # have to end on a good note!
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.