অজগর কীভাবে কাজ করে? কোথাও () কাজ করে?


94

আমি numpyডকুমেন্টেশন দিয়ে খেলছি এবং খনন করছি এবং আমি কিছু জাদু পেয়েছি। যথা: আমি কথা বলছি numpy.where():

>>> x = np.arange(9.).reshape(3, 3)
>>> np.where( x > 5 )
(array([2, 2, 2]), array([0, 1, 2]))

তারা কীভাবে অভ্যন্তরীণভাবে অর্জন করবে যে আপনি x > 5কোনও পদ্ধতিতে কোনও কিছু পাস করতে সক্ষম ? আমার ধারণা এটির সাথে কিছু করার আছে __gt__তবে আমি একটি বিশদ ব্যাখ্যা খুঁজছি।

উত্তর:


75

তারা কীভাবে অভ্যন্তরীণভাবে অর্জন করবে যে আপনি কোনও পদ্ধতিতে x> 5 এর মতো কিছু পাস করতে সক্ষম?

সংক্ষিপ্ত উত্তরটি তারা দেয় না।

একটি নমপি অ্যারেতে কোনও ধরণের লজিক্যাল অপারেশন একটি বুলিয়ান অ্যারে প্রদান করে। (যেমন __gt__, __lt__ইত্যাদি ইত্যাদি সমস্ত প্রদত্ত শর্তটি সত্য যেখানে বুলিয়ান অ্যারে দেয়)।

যেমন

x = np.arange(9).reshape(3,3)
print x > 5

উৎপাদনের:

array([[False, False, False],
       [False, False, False],
       [ True,  True,  True]], dtype=bool)

এই একই কারণেই if x > 5:যদি xকোনও নম্র অ্যারে হয় তবে এর মতো কোনও কিছু একটি মান মূল্য উত্থাপন করে । এটি সত্য / মিথ্যা মানের একটি অ্যারে, একক মান নয়।

তদ্ব্যতীত, ন্যালি অ্যারেগুলি বুলিয়ান অ্যারে দ্বারা সূচক করা যেতে পারে। যেমন x[x>5]ফলন [6 7 8], এক্ষেত্রে ।

সত্যি বলতে, এটি মোটামুটি বিরল যা আপনার আসলে প্রয়োজন numpy.whereতবে এটি কেবল সেই সূত্রগুলি ফিরিয়ে দেয় যেখানে বুলিয়ান অ্যারে রয়েছে True। সাধারন বুলিয়ান ইনডেক্সিংয়ের মাধ্যমে আপনি যা প্রয়োজন তা করতে পারেন।


10
শুধু যে বাতলান numpy.where2 'অপারেশনাল মোড', প্রথম এক রিটার্ন আছে indices, যেখানে condition is Trueএবং ঐচ্ছিক প্যারামিটার যদি xএবং yউপস্থিত (হিসাবে একই আকৃতি condition, বা এই ধরনের আকৃতি broadcastable!), তা থেকে মান ফিরে আসবে xযখন condition is Trueঅন্যথায় থেকে y। সুতরাং এটি whereআরও বহুমুখী করে তোলে এবং এটি প্রায়শই ব্যবহার করা সক্ষম করে। ধন্যবাদ
খান

4
এছাড়া ব্যবহার কিছু কিছু ক্ষেত্রে ওভারহেড হতে পারে __getitem__বাক্য গঠন প্রণালী []উপর পারেন numpy.whereবা numpy.take। যেহেতু __getitem__স্লাইসিংকেও সমর্থন করতে হবে, তাই কিছু ওভারহেড রয়েছে। পাইথন পান্ডাস ডেটা স্ট্রাকচারের সাথে কাজ করার সময় এবং যৌক্তিকভাবে খুব বড় কলামগুলিকে ইনডেক্স করার সময় আমি লক্ষ্যণীয় গতির পার্থক্য দেখেছি। এই ক্ষেত্রে, যদি আপনার কাটা কাটা দরকার না হয়, তবে takeএবং whereআসলে আরও ভাল।
ইলি

24

পুরানো উত্তর এটি বিভ্রান্তিকর এক ধরণের। এটি আপনাকে যেখানে আপনার স্ট্যাটমেন্টটি সত্য তা LOCATIONS (তাদের সমস্ত) দেয়।

সুতরাং:

>>> a = np.arange(100)
>>> np.where(a > 30)
(array([31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
       48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64,
       65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81,
       82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98,
       99]),)
>>> np.where(a == 90)
(array([90]),)

a = a*40
>>> np.where(a > 1000)
(array([26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42,
       43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
       60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76,
       77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93,
       94, 95, 96, 97, 98, 99]),)
>>> a[25]
1000
>>> a[26]
1040

আমি এটিকে list.index () এর বিকল্প হিসাবে ব্যবহার করি তবে এর আরও অনেকগুলি ব্যবহার রয়েছে। আমি এটি 2D অ্যারে ব্যবহার করে নি।

http://docs.scipy.org/doc/numpy/references/generated/numpy.where.html

নতুন উত্তর বলে মনে হচ্ছে সেই ব্যক্তি আরও কিছু মৌলিক কথা জিজ্ঞাসা করেছিলেন।

প্রশ্নটি ছিল আপনি কীভাবে এমন কোনও কিছু কার্যকর করতে পারেন যা কোনও ফাংশনকে (যেমন যেখানে) অনুরোধ করা হয়েছিল তা জানতে অনুমতি দেয়।

প্রথম দ্রষ্টব্য যে তুলনা অপারেটরগুলির মধ্যে যে কোনওটিকে কল করা একটি আকর্ষণীয় কাজ করে।

a > 1000
array([False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False,  True,
        True,  True,  True,  True,  True,  True,  True,  True,  True,
        True,  True,  True,  True,  True,  True,  True,  True,  True,
        True,  True,  True,  True,  True,  True,  True,  True,  True,
        True,  True,  True,  True,  True,  True,  True,  True,  True,
        True,  True,  True,  True,  True,  True,  True,  True,  True,
        True,  True,  True,  True,  True,  True,  True,  True,  True,
        True,  True,  True,  True,  True,  True,  True,  True,  True,
        True`,  True,  True,  True,  True,  True,  True,  True,  True,  True], dtype=bool)`

এটি "__gt__" পদ্ধতিটি ওভারলোড করে করা হয়। এই ক্ষেত্রে:

>>> class demo(object):
    def __gt__(self, item):
        print item


>>> a = demo()
>>> a > 4
4

আপনি দেখতে পাচ্ছেন, "a> 4" ছিল বৈধ কোড।

আপনি এখানে সমস্ত ওভারলোডেড ফাংশনগুলির একটি সম্পূর্ণ তালিকা এবং ডকুমেন্টেশন পেতে পারেন: http://docs.python.org/references/datamodel.html

অবিশ্বাস্যরকম কিছু হ'ল এটি করা কত সহজ। পাইথনে সমস্ত অপারেশন এমনভাবে করা হয়। A> খ বলা a এর সমতুল্য। জিটি (খ)!


4
এই তুলনা অপারেটর ওভারলোডিংটি আরও জটিল লজিক্যাল এক্সপ্রেশনগুলির সাথে ভাল কাজ করে বলে মনে হচ্ছে না - উদাহরণস্বরূপ আমি এটি করতে পারি না np.where(a > 30 and a < 50)বা np.where(30 < a < 50)কারণ এটি বুলিয়ানগুলির দুটি অ্যারের লজিকাল এবং মূল্যায়ন করার চেষ্টা করে, যা বেশ অর্থহীন। এরকম শর্তটি লেখার কোনও উপায় আছে কি np.where?
ডেভিডা

@ মেসোস্কোয়াকnp.where((a > 30) & (a < 50))
21

কেন আপনার উদাহরণে একটি তালিকা ফেরত এনপি.হোয়ার ()?
আন্দ্রেয়াস ইয়াঙ্কোপলাস

0

np.whereনম্পি নাদারের মাত্রার সমান দৈর্ঘ্যের একটি দ্বিগুণ ফিরিয়ে দেয় যার উপর এটি বলা হয় (অন্য কথায় ndim) এবং টিপলের প্রতিটি আইটেম প্রাথমিক নাদার্রে সেই সমস্ত মানগুলির সূচকগুলির একটি নকল নাদার্রে যার জন্য শর্তটি সত্য। (দয়া করে আকারের সাথে মাত্রাকে বিভ্রান্ত করবেন না)

উদাহরণ স্বরূপ:

x=np.arange(9).reshape(3,3)
print(x)
array([[0, 1, 2],
      [3, 4, 5],
      [6, 7, 8]])
y = np.where(x>4)
print(y)
array([1, 2, 2, 2], dtype=int64), array([2, 0, 1, 2], dtype=int64))


y দৈর্ঘ্যের 2 টি দ্বিগুণ কারণ 2 x.ndimহয়। টুপলে 1 ম আইটেমটিতে 4 এর চেয়ে বেশি সমস্ত উপাদানগুলির সারি সংখ্যা থাকে এবং 2 য় আইটেমটিতে 4 টিরও বেশি আইটেমের কলাম সংখ্যা থাকে you আপনি দেখতে পাচ্ছেন, [1,2,2 , 2] 5,6,7,8 এর সারি সংখ্যার সাথে মিল এবং [2,0,1,2] 5,6,7,8 কলামের সাথে মিল রয়েছে নোটেরে প্রথম মাত্রা বরাবর বিভাজিত হয়েছে (সারি অনুসারে) )।

একইভাবে,

x=np.arange(27).reshape(3,3,3)
np.where(x>4)


এক্সের 3 টি মাত্রা রয়েছে বলে দৈর্ঘ্যের 3 টি দ্বিগুণ ফিরে আসবে।

তবে অপেক্ষা করুন, এখানে আরও কিছু আছে!

যখন দুটি অতিরিক্ত যুক্তি যুক্ত করা হয় np.where; এটি উপরের টিপল দ্বারা প্রাপ্ত সমস্ত জোড়াযুক্ত সারি-কলাম সংমিশ্রণের জন্য একটি প্রতিস্থাপন অপারেশন করবে।

x=np.arange(9).reshape(3,3)
y = np.where(x>4, 1, 0)
print(y)
array([[0, 0, 0],
   [0, 0, 1],
   [1, 1, 1]])
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.