NumPy Array Iterating
تکرار روی آرایهها
منظور از تکرار کردن (iterating) انجام یک عمل مشخص (تکراری) روی تک تک عناصر یک آرایه است.
برای انجام تکرار روی عناصر آرایهها در NumPy که چند بعدی هستند، میتوان از دستور پایهای ایجاد حلقه for
استفاده کرد.
برای یک آرایه یک بعدی، حلقه for
تک تک آرایهها را بررسی میکند.
تکرار روی آرایههای دو بعدی
برای یک آرایه دو بعدی حلقه for
تکرار را روی سطرها انجام میدهد.
اگر بخواهید مقادیر اصلی، اسکالرها، را برگردانید، باید یک حلقه دیگر روی آن بعد شکل دهیم (حلقه تو در تو). برای درک بهتر مطلب به کد زیر دقت کنید.
تکرار روی آرایههای سه بعدی
حلقه for
برای یک آرایه سه بعدی تکرارها را روی آرایههای ۲ بعدی انجام میدهد.
برای برگرداندن مقادیر اصلی، اسکالرها، باید تکرار را روی تمامی بعدهای آرایه انجام دهیم.
استفاده از ()nditer جهت تکرار روی آرایهها
تابع nditer()
یک تابع کمکی است که میتوان از آن در تکرارهای ساده تا خیلی پیشرفته استفاده کرد. مشکلات اساسی که هنگام تکرار روی آرایهها ممکن است با آنها مواجه شویم را برای ما مرتفع میکند. در زیر این مطلب را با مثالهای مختلف بررسی کردهایم.
تکرار روی عناصر اسکالر یک آرایه:
مشاهده کردیم که در حلقه for
کلاسیک باید به تعداد بعدهای یک آرایه حلقه for
نوشته شود تا به مقادیر اصلی یا همان اسکالرهای یک آرایه دسترسی پیدا کنیم. نوشتن این تعداد حلقه for
مخصوصا برای آرایههایی با ابعاد زیاد میتواند دردسرساز شود. در زیر مشاهده میکنید با استفاده از تابع nditer()
و تنها نوشتن یک حلقه for
روی عناصر اسکالر یک آرایه سه بعدی تکرار را انجام دادهایم.
تکرار روی آرایههایی شامل عناصر با نوع متفاوت:
میتوانیم در هنگام انجام تکرار آرگومان اختیاری op_dtypes
را با نوع دادهای که انتظار داریم وارد کنیم. NumPy نوع دادهها را درجا (زمانی که داده داخل آرایه است) تغییر نمیدهد. بنابراین برای انجام این کار به فضای دیگری نیاز دارد که به این فضای اضافی بافر (buffer) میگوئیم. برای فعال کردن آن کافی است در تابع nditer()
مقدار flags=['buffered']
را وارد کنیم.
در کد زیر روی عناصر به عنوان یک رشته تکرار را انجام میدهیم.
تکرار با گامهای متفاوت
در کد زیر روی عناصر اسکالر یک آرایه دوبعدی به صورت یکی در میان تکرار را انجام دادهایم.
تکرار شماره دار با استفاده از ()ndenumerate
یکایک شماری (enumeration) به این معنی است که به دنباله اعداد چیزی به صورت یک به یک اشاره شود.
گاهی اوقات به شماره ایندکس عنصر مربوطه در هنگام تکرار نیاز داریم، در چنین مواقعی میتوان از تابع شیء ndenumerate()
استفاده کرد.
مثال ndenumerate()
برای آرایه یک بعدی:
مثال ndenumerate()
برای آرایه دو بعدی: