NumPy Array Iterating

تکرار روی آرایه‌ها

منظور از تکرار کردن (iterating) انجام یک عمل مشخص (تکراری) روی تک تک عناصر یک آرایه است.

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

برای یک آرایه یک بعدی، حلقه for تک تک آرایه‌ها را بررسی می‌کند.


import numpy as np

arr = np.array([1, 2, 3])

for x in arr:
print(x)

خروجی:

تکرار روی آرایه‌های دو بعدی

برای یک آرایه دو بعدی حلقه for تکرار را روی سطرها انجام می‌دهد.


import numpy as np

arr = np.array([[1, 2, 3], [4, 5, 6]])

for x in arr:
print(x)

خروجی:

اگر تکرار را روی یک آرایه n بعدی انجام دهیم، حلقه روی 1-n بعد تکرار را انجام می‌دهد.

اگر بخواهید مقادیر اصلی، اسکالرها، را برگردانید، باید یک حلقه دیگر روی آن بعد شکل دهیم (حلقه تو در تو). برای درک بهتر مطلب به کد زیر دقت کنید.


import numpy as np

arr = np.array([[1, 2, 3], [4, 5, 6]])

for x in arr:
for y in x:
print(y)

خروجی:

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

حلقه for برای یک آرایه سه بعدی تکرارها را روی آرایه‌های ۲ بعدی انجام می‌دهد.


import numpy as np

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

for x in arr:
print(x)

خروجی:

برای برگرداندن مقادیر اصلی، اسکالرها، باید تکرار را روی تمامی بعدهای آرایه انجام دهیم.


import numpy as np

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

for x in arr:
for y in x:
for z in y:
print(z)

خروجی:

استفاده از ()nditer جهت تکرار روی آرایه‌ها

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

تکرار روی عناصر اسکالر یک آرایه:

مشاهده کردیم که در حلقه for کلاسیک باید به تعداد بعدهای یک آرایه حلقه for نوشته شود تا به مقادیر اصلی یا همان اسکالرهای یک آرایه دسترسی پیدا کنیم. نوشتن این تعداد حلقه for مخصوصا برای آرایه‌هایی با ابعاد زیاد می‌تواند دردسرساز شود. در زیر مشاهده می‌کنید با استفاده از تابع nditer() و تنها نوشتن یک حلقه for روی عناصر اسکالر یک آرایه سه بعدی تکرار را انجام داده‌ایم.


import numpy as np

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

for x in np.nditer(arr):
print(x)

خروجی:

تکرار روی آرایه‌هایی شامل عناصر با نوع متفاوت:

می‌توانیم در هنگام انجام تکرار آرگومان اختیاری op_dtypes را با نوع داده‌ای که انتظار داریم وارد کنیم. NumPy نوع داده‌ها را درجا (زمانی که داده داخل آرایه است) تغییر نمی‌دهد. بنابراین برای انجام این کار به فضای دیگری نیاز دارد که به این فضای اضافی بافر (buffer) می‌گوئیم. برای فعال کردن آن کافی است در تابع nditer() مقدار flags=['buffered'] را وارد کنیم.

در کد زیر روی عناصر به عنوان یک رشته تکرار را انجام می‌دهیم.


import numpy as np

arr = np.array([1, 2, 3])

for x in np.nditer(arr, flags=['buffered'], op_dtypes=['S']):
print(x)

خروجی:

تکرار با گام‌های متفاوت

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


import numpy as np

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

for x in np.nditer(arr[:, ::2]):
print(x)

خروجی:

تکرار شماره دار با استفاده از ()ndenumerate

یکایک شماری (enumeration) به این معنی است که به دنباله اعداد چیزی به صورت یک به یک اشاره شود.

گاهی اوقات به شماره ایندکس عنصر مربوطه در هنگام تکرار نیاز داریم، در چنین مواقعی می‌توان از تابع شیء ndenumerate() استفاده کرد.

مثال ndenumerate() برای آرایه یک بعدی:


import numpy as np

arr = np.array([1, 2, 3])

for idx, x in np.ndenumerate(arr):
print(idx, x)

خروجی:

مثال ndenumerate() برای آرایه دو بعدی:


import numpy as np

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

for idx, x in np.ndenumerate(arr):
print(idx, x)

خروجی: