পাইথনে অদ্ভুত প্রকারগুলি কীভাবে চিহ্নিত করব?


101

কীভাবে নির্ভরযোগ্যভাবে নির্ধারণ করা যায় যে কোনও বস্তুর একটি অদ্ভুত প্রকার রয়েছে?

আমি বুঝতে পারি যে এই প্রশ্নটি হাঁসের টাইপিংয়ের দর্শনের বিপরীতে চলেছে, তবে ধারণাটি নিশ্চিত করা হয় যে কোনও ফাংশন (যা স্কিপি এবং নম্পি ব্যবহার করে) কখনই কোনও নমপি টাইপ না বললে কোনও ফাংশন (কখনই স্ক্রপি এবং নিম্পি ব্যবহার করে) কখনই ফিরিয়ে দেয় না। এটি অন্য প্রশ্নের সমাধানে উঠে আসে, তবে আমি মনে করি যে কোনও বস্তুর একটি অদ্ভুত টাইপ রয়েছে কিনা তা নির্ধারণের সাধারণ সমস্যা সেই মূল প্রশ্ন থেকে অনেক দূরে যে তাদের আলাদা করা উচিত।


একটি প্রশ্ন: আপনি যদি (বা, বলুন, স্কিপি) একটি টাইপ সংজ্ঞায়িত করেন যা একটি ছদ্মবেশী টাইপ সাবক্লাস করে, তবে সেই গণনা করা উচিত কি না? (আমি বিশ্বাস করি যে আপনি পাইথনে আকাঙ্ক্ষিত প্রকারগুলি সাবক্লাস করতে পারবেন না, তবে আপনি একটি সি মডিউলও করতে পারেন, এবং আমি মনে করি আপনি পাইপাইতে নমপাই টাইপগুলিও সাবক্লাস করতে পারেন… তাই সম্ভবত এটি কোনও ব্যাপার নয়, তবে এটি যে কল্পনা করতে পারেন তা অকল্পনীয় নয়))
অবতারিত

আমি এটা ভেবে দেখিনি; মূলত আপনার মন্তব্যটি উল্লেখ করেছে যে প্রশ্নটি প্রত্যাশার চেয়ে বেশি কঠিন। সত্যই উচ্চতর স্তরের বিবেচনা আমার পরিস্থিতির জন্য ওভারকিল। সাধারণ এবং বহনযোগ্য উত্তরের জন্য, আমি বলব যে যতক্ষণ আচরণ সংজ্ঞায়িত হয় ততক্ষণ ঠিক আছে।
ডগলাস বি স্ট্যাপল

উত্তর:


117

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

4
এই সমাধানটি লুকানো বৈশিষ্ট্যের উপর নির্ভর করে খুব অযৌক্তিক বলে মনে হয়। তবে সেটা কি কেবল স্বাদের বিষয়?
j08lue

4
পছন্দ করেছেন তবুও এটি অযৌক্তিক, তবে আমি মনে করি এটি সমস্যার অন্তর্নিহিত। (এবং আমি এটি পাইথনের একটি শক্তি বলে মনে করি যে আপনি যখন ভাষাটি নিরুৎসাহিত করে কিছু করতে চান, তবে সর্বোত্তম সমাধানটি সাধারণত খুব খারাপভাবে বলা যায় যে আপনি এমন কিছু করছেন যা সাধারনত একটি খারাপ ধারণা
ab

73

আমি যে সমাধানটি নিয়ে এসেছি তা হ'ল:

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

যাইহোক, এটি 100% পরিষ্কার নয় যে সমস্ত নালীর ধরনগুলি হয় np.ndarrayবা একটির জন্য গ্যারান্টিযুক্ত np.genericএবং এটি সম্ভবত সংস্করণ শক্তিশালী নয়।


4
আমি মনে করি আপনি dir(numpy)টাইপ এবং বিল্টিন ফাংশনগুলিতে ফিল্টার করতে পারেন (এবং ক্লাসগুলি, তবে আমি মনে করি না এটির কোনও রয়েছে) এবং এটির isinstanceবিরুদ্ধে একটি টিউপল তৈরি করতে এটি ব্যবহার করুন যা শক্ত হবে। (আমি বিশ্বাস করি যে আপনি বিল্টইন ফাংশনগুলি বাস্তবে নির্মাতারা টাইপ করছেন কি না তা বিলোপ করতে পারবেন তবে আপনাকে এটি পরীক্ষা করতে হবে।)
২৪

হ্যাঁ, এগুলি সমস্ত দুটি এএফআইএকের সাবক্লাস হওয়া উচিত।
সেবার্গ

@ সেবার্গ ধন্যবাদ এটি অবশ্যই আপাতত ক্ষেত্রে হতে পারে বলে মনে হয় তবে পাইথন ডকুমেন্টেশন এ সম্পর্কে খুব স্পষ্ট নয় এবং এটি ভবিষ্যতে অনুমেয়ভাবে পরিবর্তিত হতে পারে।
ডগলাস বি স্ট্যাপল

20

পুরানো প্রশ্ন তবে আমি একটি উদাহরণ সহ একটি নির্দিষ্ট উত্তর নিয়ে এসেছি। প্রশ্নগুলি তাজা রাখতে আঘাত করতে পারছি না কারণ আমার একই সমস্যা ছিল এবং এর সুস্পষ্ট উত্তর আমি পাইনি। কীটি হ'ল আপনি 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মূল ধরণের সাথে তুলনা করতে পারেন , যার তালিকায় আপনি এটি খুঁজে পেতে পারেন np.core.numerictypes.genericTypeRank। মনে রাখবেন যে এই তালিকার উপাদানগুলি স্ট্রিং, তাই আপনাকে একটি করতে হবে tested.dtype is np.dtype(an_element_of_the_list)...

+1 যদি আপনি আসলে "একটি numpyধরণ" ব্যতীত অন্য কিছু সন্ধান করছেন , এবং এটি কিছু কী তা নির্ধারণ করতে পারেন তবে এটি অন্যান্য উত্তরের চেয়ে ভাল better এবং বেশিরভাগ ক্ষেত্রে, আপনার নির্দিষ্ট কিছু সন্ধান করা উচিত যা আপনি সংজ্ঞায়িত করতে পারেন।
অবধি

8

প্রকারটি পেতে, অন্তর্নির্মিত typeফাংশনটি ব্যবহার করুন । সঙ্গে inঅপারেটর, আপনি যদি টাইপ চেক যদি এটা স্ট্রিং ধারণ করে একটি numpy ধরনের পরীক্ষা করতে পারেন 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

(এই উদাহরণটি আইপিথনে চালিত হয়েছিল , ইন্টারেক্টিভ ব্যবহার এবং দ্রুত পরীক্ষার জন্য খুব কার্যকর))


4
এটি কাজ করে, তবে আপনি যদি নামটির কোনও ধরণের সংজ্ঞা দেন, বলুন, "নম্পিগ্রুপ", আপনি মিথ্যা ধনাত্মক পাবেন। এছাড়াও, ধরণের স্ট্রিং উপস্থাপনার উপর নির্ভর করে একটি খারাপ ধারণা যদি আপনি এড়াতে পারেন — এবং এই ক্ষেত্রে, আপনি এটি করতে পারেন। পরিবর্তে এর মডিউলটি দেখুন।
শে

মডিউল ব্যবহার করা আসলেই আরও ভাল সমাধান solution
রোল্যান্ড স্মিথ


@ ওমকার.কে রেজেেক্স কিসের জন্য ব্যবহার করা যেতে পারে? কিছুটা জটিল পদ্ধতিতে ঠিক একই চেকটি করতে?
abarnert

@ আবামার্ট "ক্যান" আমি যা বলেছিলাম তা হ'ল রেজেেক্সও এগুলির মতো সাধারণ কাজগুলির জন্য জটিল দেখতে পারে তবে এটি বড় স্ট্রিং প্রসেসিংয়ের কাজগুলির জন্য অত্যন্ত দরকারী, সুতরাং এটি শেখা কোনও খারাপ ধারণা নয়। আমার ধারণা আপনি ইতিমধ্যে জানেন যেহেতু আপনার পোর্টফোলিও আপনাকে সিনিয়র প্রোগ্রামার হিসাবে চিত্রিত করেছে?
ওমাকার্টগ

3

লক্ষ্য করুন type(numpy.ndarray)একটি হল typeনিজেই এবং বুলিয়ান এবং স্কালে ধরনের জন্য সতর্ক। এটি স্বজ্ঞাত বা সহজ না হলে খুব বেশি হতাশ হবেন না, এটি প্রথমে ব্যথা।

আরও দেখুন: - https://docs.scipy.org/doc/numpy-1.15.1/references/arrays.dtyype.html - https://github.com/machinalis/mypy-data/tree/master/numpy- মাইপি

>>> 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/references/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!
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.