جلسه سی ام علم داده با استفاده از پایتون مرتب سازی در Numpy از کتاب python data science handbook
مرتب سازی های partial (partitioning)
بعضی مواقع ما علاقه مند نیستیم که همه آرایه را مرتب سازی نماییم، اما به سادگی میخواهیم که K کوچکترین ارزشهای آرایه را پیدا کنیم. NumPy این کار را با استفاده از تابع np.partition انجام می دهد. Np.partition یک آرایه را می گیرد و یک عدد K را می گیرد، نتیجه یک آرایه جدید است که K ارزشهای کوچکترین در سمت چپ partition قرار می گیرد و ارزشهای باقیمانده در سمت راست قرار می گیرد و ترتیب آنها نیز لزوما مرتب نخواهد بود.
In[12]: x = np.array([7, 2, 3, 1, 6, 5, 4])
np.partition(x, 3)
Out[12]: array([2, 1, 3, 4, 6, 5, 7])
توجه کنید که سه ارزش اول در آرایه حاصل شده سه تا کوچکترین ارزشها در آرایه اصلی هستند و مکانهای باقیمانده آرایه شامل ارزشهای باقیمانده آرایه اصلی هستند. در هر دو قسمت عناصر بصورت دلبخواهی قرار می گیرند و مرتب نیستند.
شبیه بحث مرتب سازی ما میتوانیم پارتیشن را در یک بعد axis دلخواه از یک آرایه چند بعدی ا multidilensional array انجام دهیم.
In[13]: np.partition(X, 2, axis=1)
Out[13]: array([[3, 4, 6, 7, 6, 9],
[2, 3, 4, 7, 6, 7],
[1, 2, 4, 5, 7, 7],
[0, 1, 4, 5, 9, 5]])
نتیجه یک آرایه است که دو عنصر اول هر سطر شامل کوچکترین ارزشهااز سطر است، و باقیمانده ارزشها باقیمانده جاها را پر کرده اند.
در پایان اینکه، همانطور که np.argsort محاسبه ایندکسها از مرتب سازی راانجام می دهد، یک تابع np.argpartition نیز هست که ایندکسهای پارتیشن را محاسبه می نماید که آن را در عمل در بخش بعد میبینیم.
مثال: K نزدیکترین همسایه ها
تلاش می کنیم به سرعت ببینیم که چطور ما می توانیم از تابع argsort در چندین بعد برای پیدا کردن همسایه ها از هر نقطه در یک مجموعه استفاده نماییم. ما کار را با به وجود آوریدن یک مجموعه تصادفی از ده نقطه در یک آرایه دو بعدی شروع می کنیم. با استفاده از قرارداد معمول خود آرایه را به سرعت یک آرایه ده سطری و دو ستونی تشکیل می دهیم:
In[14]: X = rand.rand(10, 2)
برای اینکه ایده ای از چگونگی آنکه نقاط به چه شکل به نظر می رسند با استفاده از نمودار نقطه ای scatter plot نقاط را در شکل نشان می دهیم.
پIn[15]: %matplotlib inline
import matplotlib.pyplot as plt
import seaborn; seaborn.set() # Plot styling
plt.scatter(X[:, 0], X[:, 1], s=100);
شکل نمایش تصویری نقاط در مثال k همسایه
اکنون ما میخواهیم فاصله بین هر جفت از نقطه ها را محاسبه نماییم. به یاد بیاورید که مربع فاصله بین دو نقطه جمع مربعات فواصل هر بعد آن دو نقطه است.با استفاده از پخشی broadcasting به نحو کارآمد که قبلا در بخش محاسبات بر ارایهها پخشی و تجمعات حداقل حداکثر و هر چیزی مابین آن دو ، روتینهایی معرفی توسط Numpy شده است که ما میتونیم برای ماتریک مربعات فاصله در یک خط کد استفاده نماییم:
In[16]: dist_sq = np.sum((X[:,np.newaxis,:] - X[np.newaxis,:,:]) ** 2, axis=-1)
این عملیات مطالب زیادی را در یک خط جاداده است و به نظر مقداری پیچیده می آید اگر با قوانین broadcasting در Numpy آشنا نباشید. وقتی که شما چنین کد یک خطی پیچیده ای را می بینید میتواند مفید باشد که آن را به چند بخش جدا بشکنید تا عملکرد آن واضح تر شود.
In[17]: # for each pair of points, compute differences in their coordinates
differences = X[:, np.newaxis, :] - X[np.newaxis, :, :]
differences.shape
Out[17]: (10, 10, 2)
In[18]: # square the coordinate differences
sq_differences = differences ** 2
sq_differences.shape
Out[18]: (10, 10, 2)
In[19]: # sum the coordinate differences to get the squared distance
dist_sq = sq_differences.sum(-1)
dist_sq.shape
Out[19]: (10, 10)
دکتر اسدی عضو هیات علمی دانشگاه آزاد، دوره آموزشی پایتون ارتباط از طریق موبایل 09305803459 و اکانت تلگرام این خط،
آیدی گروه تلگرام آموزشی برنامه نویسی پایتون: @python765
آیدی کانال متصل به گروه: @python654
فعلا تدریس کتاب python crash course چاپ دوم فایل پی دی اف و کتاب python notes for professionals
محل شرکت کامپیوتری نزدیک مترو شادمان شهر تهران جهت هماهنگیهای حضوری
Информация по комментариям в разработке