پیمایش آرایه یا iterate به این معناست که یکی یکی به تمام درایههای آرایه دستیابی پیدا کنیم. از آن جایی که ما در numpy با آرایههای یک یا چند بعدی روبهرو هستیم، برای پیمایش آرایه میتوان از حلقه for استفاده کرد. در مثال زیر با پیمایش آرایه، تمامی عناصر آن چاپ میشوند:
1 2 3 4 5 6 |
import numpy as np arr = np.array([1, 2, 3]) for x in arr: print(x) |
پیمایش آرایه دو بعدی در numpy
اگر به روشی که در بالا ارائه شد، پیمایش را با استفاده از حلقه for برای آرایه دو بعدی اجرا کنیم، آرایههای یک بعدی موجود در آن چاپ میشوند:
1 2 3 4 5 6 |
import numpy as np arr = np.array([[1, 2, 3], [4, 5, 6]]) for x in arr: print(x) |
اگر به این شیوه یک ماتریس n بعدی را پیمایش کنیم، تنها ماتریسهای بزرگ داخل لایه اول چاپ میشوند نه تک تک عناصر اسکالر؛ اگر بخواهیم تک تک عناصر اسکالر را چاپ کنیم، باید از حلقههای تو در تو کمک بگیریم. به مثال زیر توجه کنید:
1 2 3 4 5 6 7 |
import numpy as np arr = np.array([[1, 2, 3], [4, 5, 6]]) for x in arr: for y in x: print(y) |
پیمایش آرایه سه بعدی در numpy
اگر برای پیمایش آرایه سه بعدی، تنها از یک حلقه for کمک بگیریم، آرایههای دو بعدی موجود در آن چاپ میشوند. به مثال زیر توجه کنید:
1 2 3 4 5 6 |
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) |
برای پیمایش تک تک عناصر آرایه سه بعدی، میتوانید از سه حلقه for تو در تو استفاده کنید:
1 2 3 4 5 6 7 8 |
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 میتوان انواع و اقسام پیمایشهای پیشرفته را برای آرایههای numpy پیادهسازی کرد. این متد در واقع سختیهای پیمایش با استفاده از حلقه for را حل میکند. در ادامه مهمترین کاربردهای متد ()nditer را بررسی میکنیم:
پیمایش عناصر اسکالر آرایه با nditer
با استفاده از تکه کد سادهی زیر، میتوان تمام عناصر اسکالر آرایه با هر بعدی را پیمایش کرد:
1 2 3 4 5 6 |
import numpy as np arr = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]]) for x in np.nditer(arr): print(x) |
تغییر دیتا تایپ همزمان با پیمایش آرایه با استفاده از تابع nditer
با استفاده از آرگومان op_dtype میتوانیم همزمانی که آرایه را پیمایش میکنیم، دیتا تایپ عناصر موجود در آن را نیز تغییر دهیم. توجه کنید که این کار تغییری در آرایهی اصلی به وجود نمیآورد؛ بنابراین باید عناصر جدید را در جایی ذخیره کنیم. به این حافظه، بافر میگوییم و با آرگومان flags به شیوهی زیر آن را تعریف میکنیم:
1 2 3 4 5 6 |
import numpy as np arr = np.array([1, 2, 3]) for x in np.nditer(arr, flags=['buffered'], op_dtypes=['S']): print(x) |
پیمایش آرایه با گام دلخواه با استفاده از تابع nditer
با استفاده از روشهای توضیح داده شده در قسمت پیمایش آرایهها، به روش زیر میتوان برای پیمایش، گام مشخصی تعریف کرد:
1 2 3 4 5 6 |
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
گاهی نیاز داریم در هنگام پیمایش آرایه، علاوه بر دسترسی به مقادیر موجود در هر خانه آرایه، به ایندکس آن مقدار نیز دسترسی پیدا کنیم؛ در این مواقع میتوان از متد ndenumerate استفاده کرد. به مثال زیر توجه نمایید:
1 2 3 4 5 6 |
import numpy as np arr = np.array([1, 2, 3]) for idx, x in np.ndenumerate(arr): print(idx, x) |
1 2 3 4 5 6 |
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) |