نمایه سازی

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

 در زیر نمایه سازی در یک آرایه تک بعدی را می‌بینیم.

a = np.array([10, 4, 6, 8])
print("a =", a)
print("a[0] ->", a[0])
print("a[1] ->", a[1])
print("a[2] ->", a[2])
print("a[3] ->", a[3])
print("a[-1] ->", a[-1])

خروجی کد:

a = [10  4  6  8]
a[0] -> 10
a[1] -> 4
a[2] -> 6
a[3] -> 8
a[-1] -> 8

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

a = np.array([[3, 12, 9],
              [4, 10, 8],
              [18, 7, 19],
              [1, 5, 2]])
print(a)
print("a[0, 0] ->", a[0, 0])
print("a[2, 1] ->", a[2, 1])
print("a[3, 2] ->", a[3, 2])
print("a[1, 1] ->", a[1, 1])

 

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

 

خروجی کد:

[[ 3 12  9]
 [ 4 10  8]
 [18  7 19]
 [ 1  5  2]]
a[0, 0] -> 3
a[2, 1] -> 7
a[3, 2] -> 2
a[1, 1] -> 10

حتی می‌توانیم مقدار یک خانه را از طریق آدرس آن عوض کنیم.

a[0, 0] = 100
print(a)

خروجی کد:

[[100  12   9]
 [  4  10   8]
 [ 18   7  19]
 [  1   5   2]]

می‌بینیم که مختصات 0 و 0 از 3 به 100 تغییر کرد.

برش

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

برش در آرایه‌های تک بعدی:

در آرایه‌های تک بعدی کافیست تا در [ ] اندیس ابتدایی را قرار داده و سپس یک : زده و سپس اندیس انتهایی را (یک واحد اضافه تر) می‌نویسیم و در نهایت یک : دیگر زده و سپس گام حرکت را مشخص می‌کنیم (مشخص کردن گام حرکت یعنی نوشتن : دوم، اختیاری است و اگر آن را ننویسیم به طور پیش فرض 1 در نظر گرفته می‌شود). در کد زیر مثال‌هایی را می‌توانید مشاهده کنید:

a = np.array([3, 1, 9, 4, 10, 5, 2])
print("a =", a)
print("a[1:4] ->", a[1:4])
print("a[:3] ->", a[:3])
print("a[4:] ->", a[4:])
print("a[2:5:2] ->", a[2:5:2])
print("a[::-1] ->", a[::-1])

خروجی کد:

a = [ 3  1  9  4 10  5  2]
a[1:4] -> [1 9 4]
a[:3] -> [3 1 9]
a[4:] -> [10  5  2]
a[2:5:2] -> [ 9 10]
a[::-1] -> [ 2  5 10  4  9  1  3]

 

نکته: در صورتی که اندیس ابتدایی نوشته نشود، اندیس ابتدایی صفر در نظر گرفته می‌شود و اگر اندیس انتهایی نوشته نشود، اندیس انتهایی آخرین خانه در نظر گرفته می‌شود.

 

برش در آرایه‌های چند بعدی:

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

a = np.array([[12, 4, 2, 7, 15],
              [3, 10, 8, 4, 1],
              [9, 11, 9, 6, 3],
              [7, 8, 30, 2, 1]])
print(a[1:3, 2:4])
print(a[2:, :4])
print(a[:, 2:4])

خروجی کد:

[[8 4]
 [9 6]]
[[ 9 11  9  6]
 [ 7  8 30  2]]
[[ 2  7]
 [ 8  4]
 [ 9  6]
 [30  2]]

 

نکته: مشاهده می‌کنیم که نوشتن : برای یک بعد به معنای انتخاب کل آن بعد است. مثلا در نمونه آخر کد بالا کل سطر‌ها به همراه ستون از 2 تا 4 (که می‌شود تا خود 3) را برش زدیم.

 

ترکیب نمایه سازی و برش:

برای داشتن یک زیر آرایه با مرتبه پایین‌تر (بعد پایین‌تر) از آرایه اصلی می‌توانیم نمایه سازی و برش را با هم ترکیب کنیم. برای مثال اگر a[1:3, 3] را داشته باشیم. به این معناست که از بعد اول (همان سطر در یک آرایه دو بُعدی) سطر 1 تا خود 2 برش می‌خورد و از بعد دوم هم (همان ستون در آرایه دو بعدی) ستون شماره 3 انتخاب می‌شود. نتیجه این کار یک زیر آرایه تک بعدی با اندازه (تعداد عوض) 2 خواهد بود. به مثال زیر نگاه کنید:

a = np.array([[12, 4, 2, 7, 15],
              [3, 10, 8, 4, 1],
              [9, 11, 9, 6, 3],
              [7, 8, 30, 2, 1]])
print(a[1:3, 3])
print(a[2, 1:4])

خروجی کد:

[4 6]
[11  9  6]

باز آرایی

می‌توانیم یک آرایه را بازآرایی کنیم (یعنی ابعاد آن را تغییر دهیم) اما باید توجه کتیم که اندازه آرایه (تعداد اعضای آن) با آرایه باز‌آرایی شده یکی باشد در غیر این صورت با خطا مواجه می‌شویم. برای اینکار از متد reshape استفاده می‌کنیم و اندازه ابعاد جدید را در قالب یک تاپل به عنوان ورودی به آن می‌دهیم. به مثال‌های زیر توجه کنید:

a = np.arange(20)
print(a)
print(a.reshape(4, 5))
print(a)

خروجی کد:

[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19]
[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]
 [15 16 17 18 19]]
[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19]

 

نکته: توجه کنیم که با بازآرایی یک آرایه خود آرایه دچار تغییر نمی‌شود. همانطور که در خروجی کد بالا می‌بینید پس از این که روی a دستور reshape اعمال شد دوبازه خود a را چاپ کردیم اما همان a اولی چاپ شد.

 توجه کنیم که اگر فرضاً ابعاد یک آرایه 3 در 6 باشد. ما می‌توانیم ابعاد آن را به 2 در 9 تغییر دهیم اما نمی‌توانیم ابعاد آن را به 4 در 5 تغییر دهیم چرا که اندازه بعد 4 و 5 نتیجه 20 عضو می‌دهد اما 3 در 6 دارای 18 عضو است.

تخت سازی:

اگر درون ورودی دستور reshape مقدار -1 را وارد کنیم. آرایه ما به هر اندازه بعدی که داشته باشد به آرایه تک بعدی تبدیل می‌شود. به این عمل تخت سازی می‌گوییم. به مثال زیر توجه کنید:

a = np.random.randint(1, 7, (2, 4, 3))
print(a)
print(a.reshape(-1))

خروجی کد:

[[[3 6 1]
  [1 3 1]
  [3 3 4]
  [5 5 6]]

 [[6 1 6]
  [6 1 6]
  [1 5 4]
  [4 3 6]]]
[3 6 1 1 3 1 3 3 4 5 5 6 6 1 6 6 1 6 1 5 4 4 3 6]

در کد بالا یک آرایه تصادفی با اعداد بین 1 تا خود 6 به ابعاد 2 در 4 در 3 (3 بعدی) ایجاد کردیم. (در واقع می‌توانیم اینگونه تصور کنیم که 2 آرایه 4 در 3 داریم). سپس از دستور reshape با ورودی -1 استفاده کردیم و آن را به صورت یک آرایه تک بعدی نمایش دادیم.

توسعه دهندگان
احمدرضا آهنگریان