انواع indexing آرایه در پایتون
کارکردن با آرایهها در زبانهای برنامهنویسی اهمیت بالایی دارد. در بسیاری از برنامههایی که برای شبیهسازیکردن سیستمها، پردازش سیگنال و… مینویسیم نیاز هست که از آرایهها استفاده کنیم. برای انجام محاسبات با مقادیر موجود در آرایهها، میتوان از حلقههای for و while استفاده کرد. در این روش در هر تکرار حلقه مقدار موجود در اندیسهای آرایه را انتخاب کرده و میتوان پردازش و محاسبات موردنظر را انجام داد.
هنگام کار با آرایهها در زبانهای پیشرفته، بهتر است تا جای ممکن از استفادهکردن از حلقهها بپرهیزیم، چرا که باعث کندشدن اجرا برنامه میشوند. استفادهکردن از امکانات موجود در زبانهای برنامهنویسی برای indexing آرایهها باعث میشود برنامهی موردنظر سریعتر از حالتی که خودمان با استفاده از حلقهها مینویسیم اجرا شوند. در این حالت حلقه بهصورت بهینه پیادهسازی شده و همین موضوع باعث اجرای سریعتر برنامه میشود. در این آموزش میخواهیم انواع روشهای indexing آرایههای Numpy در پایتون را بررسی کنیم. روشهای indexing مطرح شده را میتوان هنگام کار با آرایههای Matlab نیز استفاده کرد.
برای تولید بازهای از اعداد با فاصلهی ثابت از همدیگر، میتوان از تابع arange موجود در کتابخانه Numpy استفاده کرد. این تابع مقدار شروع بازه، پایان بازه و گام را دریافت کرده (arange(start, stop, step)) و اعداد موجود در بازهی بستهی مقدار شروع تا بازهی باز مقدار پایان را با گام در نظر گرفته شده تولید میکند. مقدار پیشفرض آرگومان step (گام)، یک میباشد. میخواهیم یک آرایه شامل مقادیر از صفر تا 9 را ایجاد کنیم، برای این کار میتوانیم np.arange(0, 10) یا np.arange(10) را اجرا میکنیم. مقدار پیشفرض شروع بازه صفر میباشد، بنابراین میتوانیم زمانی که بازه شروع صفر هست فقط مقدار انتهای بازه را مشخص کنیم.

برای انتخاب یک مقدار از آرایه، پس از متغیر آرایه اندیس موردنظر را در داخل براکت مینویسیم. با این کار اندیس موردنظر از آرایه انتخاب میشود و میتوان مقدار موجود در آن آدرس را استفاده کرده و یا مقدار آن اندیس را تغییر داد.

در indexing آرایهها، بهدستآوردن برشی از آرایه بسیار پرکاربرد میباشد. در این روش برشی از آرایه را میتوان انتخاب کرده و از مقادیر آن استفاده کنیم و یا آنها را تغییر دهیم. در این روش اندیس شروع و پایان را مشخص میکنیم و مقادیر موجود در آرایه را از اندیس شروع (خود مقدار اندیس شروع را شامل میشود) تا بازهی باز اندیس پایان (خود مقدار اندیس پایان را شامل نمیشود) در آرایه انتخاب میشود. میتوان گام را نیز مشخص کرد (اختیاری است).
برای بهدستآوردن برشی از آرایه، در داخل براکت ابتدا اندیس شروع (اگر صفر باشد میتوان آن را ننوشت) را نوشته و بعد از اندیس پایان را مینویسیم و بین آنها دونقطه “:” قرار میدهیم. برای مشخصکردن گام، مقدار گام را پس از اندیس پایان مینویسیم.
انواع برشها
مثالها:
انتخاب اندیسهای 2 تا خود 4:

انتخاب اندیسهای زوج (کاهش نرخ یا downsampling با نرخ 2):

انتخاب اندیسهای فرد (کاهش نرخ یا downsampling با نرخ 2):

توجه داشته باشید که آرایهای که برگردانده میشود یک view از آرایه اصلی میباشد (کپی سطحی)، یعنی مقادیر انتخاب شده بهجای دیگری از حافظه کپی نمیشوند و اندیسهای آرایه جدید به همان آدرس مقادیر که در آرایه a در آن قرار دارند اشاره میکنند. به همین دلیل اگر مقدار موجود در اندیسی از آرایه b را تغییر دهیم، این مقدار در آرایه a هم تغییر میکند. اندیس صفر از آرایه b برابر با اندیس 1 از آرایه a میباشد. مقدار b[1] را به 999 تغییر داده و مقادیر موجود در آرایه a را مجدد بررسی میکنیم.

برای اینکه مقادیر انتخاب شده از آرایه در خانههای دیگری از حافظه کپی شوند (کپی عمیق) تا اتفاق بالا رخ ندهد از متد copy استفاده میکنیم (کپی مقادیر از view برش موردنظر را برمیگرداند).

برای آرایههای دوبعدی در داخل براکت ابتدا سطرها و پس از کاما “,” ستونهای موردنظر را انتخاب میکنیم. در حالت کلی برای آرایههای چندبعدی، به ترتیب اندیسهای موردنظر از بعد صفر سپس بعد یک و… را در داخل براکت تعیین میکنیم.
مثالها:
انتخاب سطر 0:

انتخاب سطرهای 0 تا 2 :

انتخاب سطرها و ستونهای 0 تا 2 :

انتخاب ستونهای 0 تا 2 (انتخاب همه سطرها) :

در آرایههای numpy میتوان چند مقدار را انتخاب کرد. در این حالت اندیسهای موردنظر را بهصورت آرایه یا لیستی از اعداد صحیح (integer) بهعنوان اندیس (آرایه اندیسها) برای انتخاب مقادیر موردنظر استفاده میکنیم. در مثال زیر اندیسهای 4 و 6 و 1 از آرایه a را انتخاب می کنیم. برای این کار در یک لیست اندیس های مطلوب را قرار داده و از این آرایه به عنوان اندیس استفاده می کنیم. در خروجی می توان مشاهده کرد مقدار متناظر با اندیس های مورد نظرانتخاب شده و به ترتیب در آرایه ی خروجی برگردانده می شود.

در این حالت اندیسهای انتخاب شده در قسمت دیگری از حافظه کپی میشوند (کپی مقادیر برگردانده میشود نه view) بنابراین در این حالت اگر محتوای موجود در اندیسی از آرایهی b را تغییر دهیم، مقادیر موجود در آرایه a تغییر نمیکنند.

آرایه اندیسها را میتوان با استفاده از تابع np.arange و یا تابع range که یک تابع buit-in در پایتون میباشد ایجاد کرد. در مثال زیر میخواهیم اندیسهای زوج (0, 2, 4, 6, …) آرایه a را انتخاب کنیم.

ابتدا یک آرایهای از مقادیر در بازه 0 تا طول آرایه a با گام 2 ایجاد میکنیم (آرایه اندیسهای زوج) و سپس از این آرایه به عنوان اندیس استفاده میکنیم. میتوان اندیسهای مطلوب را در یک متغیر قرار داد و از آن متغیر استفاده کرد.
در این حالت با استفاده از این تابع آرایهی اندیسهای زوج را ایجاد کرده و سپس از آن استفاده میکنیم.

یکی از indexingهای پرکاربرد روش Boolean indexing میباشد. برای انتخاب مقادیر مطلوب از یک آرایه میتوان از یک آرایه شامل مقادیر True و False که هم اندازه با آرایه اصلی میباشد استفاده کرد. به این آرایه، آرایه ماسک mask)) گفته میشود. اندیسهایی از آرایه انتخاب میشوند که مقدار موجود در آن اندیسها در آرایه ماسک True باشد.
در مثال زیر دو مقدار از آرایه ماسک را True و مابقی را False در نظر میگیریم. در خروجی میتوان مشاهده کرد که مقدار متناظر با جایگاههایی که در آرایه ماسک True هستند انتخاب شده است.

میتوان مقدار اندیسهای انتخاب شده را با استفاده از یک آرایه هم طول با مقادیر انتخاب شده تغییر داد.

و یا کل مقدار اندیسهای انتخاب شده را میتوان یک مقدار تغییر داد. سه اندیس ابتدایی از آرایه را انتخاب کرده و مقدار آنها را به 0 تغییر میدهیم.

برای تولید ماسک میتوان از اپراتورهای مقایسهای >، <، =>، =<، == و!= استفاده کرد. برای مثال اگر بخواهیم مقادیر کمتر از 40 را در آرایه a انتخاب کنیم، آرایه a < 40 را بهعنوان آرایه ماسک استفاده میکنیم. با اجرای a < 40، یک آرایه logical (آرایهای فقط شامل مقادیر True و False) برگردانده میشود که اندیسهایی که مقدار موجود در آرایه a کمتر از 40 است True و مابقی False هستند. حال با استفاده از این روش میتوان مقادیر موردنظر در آرایه را انتخاب نمود.

میتوان چند ماسک منطقی هم طول را با استفاده از اپراتورهای منطقی ~، &، |، ^ ترکیب کرده و از ماسک بهدستآمده استفاده کنیم. میخواهیم اندیسهایی از آرایه را انتخاب کنیم که مقدار آنها بزرگتر از 5 و کمتر از 23 باشد. دو آرایه ماسک با این شرایط ایجاد کرده و & (and) بین آنها را محاسبه میکنیم و از آرایه بدست آمده بهعنوان ماسک استفاده میکنیم.

برای انتخاب مقادیری که زوج هستند، ابتدا باقیمانده اعداد را به 2 محاسبه کرده (a % 2) و هر یک از آن ها که 0 باشد را انتخاب میکنیم (a % 2 == 0).

برای انتخاب مقادیری که ضریب 3 نیستند ابتدا ماسک مربوط به حالتی که ضرایب 3 هستند را به صورت a % 3 == 0 محاسبه میکنیم و سپس با not کردن ماسک بدست آمده مقادیری که ضریب 3 نیستند را انتخاب میکنیم.

این نوع indexing بسیار پرکاربرد بوده و در حالتهای مختلفی مانند
میتوان استفاده کرد.
در مثال زیر میخواهیم سیگنال پله را تعریف کنیم. تابع پله در زمانهای مثبت 1 بوده و در زمانهای منفی مقدار آن 0 میباشد. آرایه ی زمان n را در بازه -4 تا 5 ایجاد میکنیم. برای تعریف سیگنال پله u در این بازه زمانی، ابتدا u را یک آرایه تمام صفر و هم طول با آرایه زمان (n) تعریف میکنیم. سپس از روی آرایه زمان (n)، آرایه ماسک را ایجاد میکنیم. آرایه ماسک را زمان@های بزرگتر مساوی 0 درنظر میگیریم (n >= 0). سپس از آرایه ماسک استفاده کرده و این اندیسها از آرایه تمام صفر u را انتخاب کرده و مقدار آنها را به 1 تغییر میدهیم.

در این آموزش روشهای مختلف indexing آرایههای numpy در پایتون را یاد گرفتیم. هنگام کارکردن با آرایههای Matlab نیز میتوانید از این روشها استفاده کنید فقط با این تفاوت که در Matlab اندیسها از 1 شروع میشوند.
مرجع: آموزش کتابخانه Numpy – مدرس حمید دانشجو
سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.