Sokan Academy

در فصل قبل، با کتابخانه NumPy آشنا شدید و در قسمت دوم با آرایه‌ها و لیست پایتون آشنا شدید و یاد گرفتید چه تفاوت‌هایی باهم دارند. پس از شناخت ساختار آرایه‌ها، گام بعدی در کار با NumPy، دسترسی به عناصر داخلی آن‌ها است.

در این قسمت از دوره آموزش کتابخانه NumPy، به بررسی ایندکس‌گذاری در آرایه‌های یک‌بعدی و دو‌بعدی می‌پردازید و یاد می‌گیرید چگونه به شکل دقیق و اصولی به داده‌های ذخیره‌شده در آرایه‌ها دسترسی داشته باشید. این مفاهیم، پایه‌ی انجام بسیاری از عملیات بعدی روی آرایه‌ها و کار با داده‌های عددی در NumPy محسوب می‌شوند.

دسترسی به اعضای آرایه‌ها (Indexing)

در این قسمت قصد داریم درباره ایندکس‌گذاری (Indexing) در آرایه‌های NumPy صحبت کنیم و ببینیم چگونه می‌توانیم به اعضای هر آرایه دسترسی داشته باشیم. معمولاً بیشترین کار ما با:

  • آرایه‌های یک‌بعدی
  • آرایه‌های دو‌بعدی
  • و گاهی آرایه‌های سه‌بعدی

است.

برای آرایه‌هایی با ابعاد بالاتر نیز می‌توان از همان منطق استفاده کرد، اما در عمل بیشترین مواردی که با آن‌ها سروکار داریم همین ساختارها هستند که در این جلسه بررسی می‌کنیم. برای اینکه بتوانید به‌راحتی به عناصر آرایه‌ها دسترسی داشته باشید، کافی است دو نکته مهم را همیشه در ذهن داشته باشید:

  • شروع ایندکس‌ها از صفر: در NumPy (و به‌طور کلی در پایتون)، شماره‌گذاری ایندکس‌ها از صفر شروع می‌شود، نه از یک.
  • دسترسی از بیرونی‌ترین بعد به درونی‌ترین بعد

زمانی که با آرایه‌های چندبعدی کار می‌کنید، همیشه باید برای دسترسی به داده‌ها:

  • ابتدا از بیرونی‌ترین لایه شروع کنید
  • و به‌تدریج به سمت لایه‌های داخلی‌تر حرکت کنید

فرض کنید یک آرایه سه‌بعدی داریم که به‌صورت چند صفحه پشت سر هم قرار گرفته است. هر صفحه شامل تعدادی سطر و ستون است.
یک آرایه سه بعدی به صورت چند صفحه‌ای
برای دسترسی به یک مقدار مشخص:

  • ابتدا مشخص می‌کنید از کدام صفحه جلو یا عقب می‌خواهید مقدار را بردارید (بعد اول)
  • سپس تعیین می‌کنید از کدام سطر بالا یا پایین (بعد دوم)
  • در نهایت مشخص می‌کنید کدام اسکالر (عدد تکی) موردنظر شماست (بعد سوم)

برای دسترسی به عناصر آرایه‌ها در NumPy، از کروشه ([]) استفاده می‌کنیم. ساختار کلی به این صورت است:

  • ابتدا نام آرایه
  • سپس یک یا چند کروشه
  • و داخل هر کروشه، شماره ایندکس مربوط به آن بعد را قرار می‌دهیم

ایندکس‌گذاری در آرایه یک‌بعدی

فرض کنید یک آرایه یک‌بعدی داریم که مقادیر آن در بازه‌ای مشخص قرار دارد. اگر بخواهیم به یک عنصر خاص دسترسی پیدا کنیم، کافی است شماره ایندکس آن عنصر را داخل کروشه قرار دهیم

# print 5th item in this array

this_array = np.arange(3, 7, 0.5)

print("This is the 5th item: ")

برای مثال، اگر عددی که می‌خواهیم در موقعیت مشخصی از آرایه قرار داشته باشد، با استفاده از ایندکس می‌توانیم دقیقاً همان عنصر را انتخاب کنیم. اگر بخواهیم به پنجمین عنصر یک آرایه یک‌بعدی دسترسی داشته باشیم، باید توجه کنیم که ایندکس‌ها از صفر شروع می‌شوند. بنابراین ترتیب ایندکس‌ها به این صورت خواهد بود:
ترتیب ایندکس گذاری در نامپای
در نتیجه، پنجمین عنصر آرایه دارای ایندکس 4 است. برای دسترسی به این مقدار:

  • ابتدا نام آرایه را می‌نویسیم
  • سپس داخل کروشه، شماره ایندکس موردنظر را قرار می‌دهیم

از آن‌جایی که آرایه یک‌بعدی است، تنها یک لایه داریم و عناصر آن همان اسکالرها هستند. بعد از اجرا میبینیم که 5 رو به ما نشان میدهد.

# print 5th item in this array

this_array = np.arange(3, 7, 0.5)

print("This is the 5th item: ", this_array[4])

# خروجی: This is the 5th item:  5.0

ایندکس‌گذاری در آرایه دو‌بعدی

حال به سراغ مثال بعدی می‌رویم. در این مثال، یک آرایه دو‌بعدی با نام matrix  داریم که ساختار آن شبیه به یک ماتریس است. این آرایه:

  • دارای ۲ سطر
  • و ۵ ستون

است.
آرایه دوبعدی
فرض کنید می‌خواهیم به عنصر قرارگرفته در سطر دوم و ستون پنجم دسترسی داشته باشیم. برای این کار:

  • ابتدا نام آرایه را می‌نویسیم
  • سپس داخل کروشه‌ها، ایندکس‌ها را با استفاده از کاما (،) از هم جدا می‌کنیم

برخلاف لیست‌های تو در تو که برای هر لایه از کروشه جداگانه استفاده می‌کردیم، در NumPy ایندکس هر بعد را با کاما از هم جدا می‌کنیم، در ایندکس‌گذاری آرایه‌های چندبعدی:

  • اولین عدد مربوط به بیرونی‌ترین بعد (سطرها)
  • عدد دوم مربوط به بعد داخلی‌تر (ستون‌ها)
  • و به همین ترتیب برای ابعاد بیشتر

در این مثال:

  • ایندکس سطر دوم برابر با ۱ است (چون از صفر شروع می‌شود)
  • ایندکس ستون پنجم برابر با ۴ است

با استفاده از این ایندکس‌ها، مقدار موردنظر انتخاب می‌شود و در نهایت عدد ۱۰ به‌عنوان خروجی به ما برگردانده می‌شود.

# Access the element on the 2nd row, 5th column:

matrix = np.array([[1,2,3,4,5], [6,7,8,9,10]])

print("Here is 5th element on 2nd row: ", matrix[1,4])

# خروجی: Here is 5th element on 2nd row:  10

انتخاب یک سطر کامل از آرایه دو‌بعدی

در مثال بعدی، از ما خواسته می‌شود که تمام عناصر سطر اول یک ماتریس را جدا کرده و داخل یک متغیر جدید ذخیره کنیم. در این ماتریس، سطر اول شامل مقادیر زیر است:
۱، ۲، ۳، ۴ و ۵
هدف این است که همه این عناصر را در یک متغیر جدید قرار دهیم. برای انجام این کار:

  • ابتدا نام آرایه (matrix) را می‌نویسیم
  • سپس یک کروشه باز و بسته قرار می‌دهیم

از آن‌جایی که می‌خواهیم:

  • به لایه اول (سطرها) مراجعه کنیم
  • و سطر اول دارای ایندکس ۰ است

عدد ۰ را به‌عنوان ایندکس سطر وارد می‌کنیم. سپس یک کاما قرار می‌دهیم و به‌جای مشخص کردن ایندکس ستون، از علامتی استفاده می‌کنیم که نشان می‌دهد تمام عناصر این سطر انتخاب شوند.

# Grab all elements on first row of matrix and save to this variable

this_variable = matrix[0,:]
this_variable

# خروجی: array([1, 2, 3, 4, 5])

معنای این دستور این است از بعد اول، عضو اول را بردار و تمام عناصر داخل آن را انتخاب کن. در نهایت، با چاپ (Print) خروجی، مشاهده می‌کنیم که تمام عناصر سطر اول داخل متغیر جدید ذخیره شده‌اند.

انتخاب یک ستون کامل از آرایه دو‌بعدی

در مثال بعدی، هدف این است که ستون سوم ماتریس را استخراج کرده و داخل یک متغیر جدید ذخیره کنیم.

در این حالت، مقادیری که باید انتخاب شوند شامل:
۳ و ۸
هستند.
در این مثال، برعکس حالت قبلی عمل می‌کنیم:

  • ابتدا همه سطرها را در نظر می‌گیریم
  • سپس ایندکس ستون موردنظر را مشخص می‌کنیم

به این ترتیب:

  • انتخاب همه سطرها در بعد اول
  • و انتخاب ستون سوم در بعد دوم

انجام می‌شود و خروجی در یک متغیر جدید ذخیره خواهد شد.

# Grab all elements on 3rd column of matrix and save to new variable

new_variable = matrix[:, 2]
new_variable

# خروجی: array([3, 8])

ایندکس‌گذاری در آرایه‌های سه‌بعدی

در مثال بعدی وارد کار با آرایه‌های سه‌بعدی می‌شویم. در این حالت، یک تانسور داریم که شامل:

  • یک ماتریس در بخش جلویی
  • و یک ماتریس در بخش پشتی

است. برای دسترسی به داده‌ها در این ساختار، دقیقاً از همان منطقی استفاده می‌کنیم که قبلاً گفتیم:

  • حرکت از بیرونی‌ترین بعد
  • به سمت لایه‌های داخلی‌تر

فرض کنید یک تانسور سه‌بعدی داریم و می‌خواهیم المان سوم از آرایه دوم داخل آرایه اول را انتخاب کنیم. در این مثال، مقدار موردنظر ۶ است. برای دسترسی به این المان، طبق قانون حرکت از بیرونی‌ترین بعد به درونی‌ترین بعد عمل می‌کنیم:

  1. بعد اول (بیرونی‌ترین لایه) → آرایه اول → ایندکس 0
  2. بعد دوم → آرایه دوم داخل آرایه اول → ایندکس 1
  3. بعد سوم (درونی‌ترین لایه) → المان سوم → ایندکس 2

با پرینت کردن این مقدار، خروجی برابر با ۶ خواهد بود.

# Access the third element of the second array of the first array:

tensor = np.array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]])

print(tensor[0, 1, 2])

# 6 

ایندکس منفی (Negative Indexing)

NumPy  امکان استفاده از ایندکس منفی را نیز فراهم می‌کند. ایندکس منفی به ما اجازه می‌دهد از آخر آرایه به سمت ابتدا شمارش کنیم.

  • 1 → آخرین عنصر
  • 2 → یکی مانده به آخر
  • 3 → دو عنصر مانده به آخر

این روش بسیار کاربردی است و در بسیاری از موارد می‌تواند جایگزین استفاده از ایندکس مثبت شود. فرض کنید می‌خواهیم عضو آخر در بعد دوم آرایه را انتخاب کنیم


می‌توانیم به جای شمارش از ابتدا، از ایندکس منفی استفاده کنیم:

# Print the last element from the 2nd dim of matrix:

print('Last element from 2nd dim: ', matrix[1, -1])

# خروجی: Last element from 2nd dim:  10

بسته به بعد سوم، انتخاب المان داخل آنبا این روش، آخرین عناصر آرایه را راحت و سریع می‌توانیم انتخاب کنیم بدون نیاز به دانستن طول آرایه.با استفاده از ایندکس منفی، می‌توانیم به راحتی به عناصر انتهایی آرایه‌ها دسترسی پیدا کنیم. برای مثال:

  • اگر بخواهیم دو عنصر آخر آرایه را انتخاب کنیم، می‌توانیم از ایندکس -2 و -1 استفاده کنیم.
  • در یک آرایه دو بعدی یا سه‌بعدی نیز همین منطق اعمال می‌شود.

فرض کنید می‌خواهیم عضو دو تا مانده به آخر را انتخاب کنیم. با ایندکس منفی، می‌توانیم این کار را به صورت زیر انجام دهیم:

# Print the last element from the 2nd dim of matrix:

print('Last element from 2nd dim: ', matrix[1, -3])

# خروجی: Last element from 2nd dim:  8

نمونه، بسته به ساختار آرایه در این مثال، مقدار ۸ به ما بازگردانده می‌شود.

انتخاب المان در آرایه سه‌بعدی با ایندکس منفی

در مثال تانسور سه‌بعدی، قبلاً مقدار ۶ را از آرایه اول و آرایهه دوم و المان آخری  انتخاب کرده بودیم. با ایندکس منفی نیز می‌توان همان المان را انتخاب کرد به جای شمارش از ابتدا، از انتها شروع می‌کنیم برای مثال: اگر بخواهیم از آرایه اول و آرایه آخر المان موردنظر را بگیریم، می‌توانیم از ایندکس منفی استفاده کنیم.

# Access the third element of the second array of the first array:

tensor = np.array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]])

print(tensor[0, -1, -1])

# 6

نکته مهم

  • ایندکس مثبت → شمارش از ابتدا
  • ایندکس منفی → شمارش از انتها

این انعطاف، دسترسی به داده‌ها در آرایه‌های چندبعدی را بسیار ساده می‌کند، بدون آنکه نیاز به دانستن دقیق طول هر بعد داشته باشیم.

جمع بندی

در این درس آموختید چگونه با استفاده از ایندکس‌گذاری، به المان‌های آرایه‌های یک‌بعدی، دو‌بعدی و سه‌بعدی دسترسی داشته باشید، سطر و ستون کامل را انتخاب کنید و با کمک ایندکس منفی از انتهای آرایه‌ها به داده‌ها دسترسی پیدا کنید.
 

Numpymulti dimensionalنامپایindexingمحاسبات عددیکتابخانه پایتونآنالیز دادهتحلیل دادهData Scienceپایتون

sokan-academy-footer-logo
کلیه حقوق مادی و معنوی این وب‌سایت متعلق به سکان آکادمی می باشد.