جستجو در آرایه (Array Search)
در این صفحه درباره جستجو در آرایه در نامپای صحبت می کنیم. یعنی از بین کلی عدد، آن هایی را پیدا کنیم که شرطی خاص دارند؛ مثل وقتی در لیست نمره ها دنبال بیست ها می گردی.
جستجو در آرایه در نامپای چیست؟
برای جستجو در آرایه در نامپای می توانیم اندیس (Index) عناصر را برگردانیم. اندیس یعنی شماره جای هر مقدار در آرایه؛ مثل شماره صندلی در کلاس.
تابع where() به ما می گوید کدام اندیس ها شرط موردنظر را دارند. خروجی این تابع یک تاپل (Tuple) است؛ یعنی یک بسته چندتایی از آرایه ها.
یافتن اندیس مقدار مشخص با where
اولین استفاده ساده از where() پیدا کردن همه اندیس های یک مقدار مشخص است.
import numpy as np
arr = np.array([1, 2, 3, 4, 5, 4, 4])
x = np.where(arr == 4)
print(x)
خروجی چیزی شبیه (array([3, 5, 6],)) است. یعنی مقدار 4 در اندیس های 3 و 5 و 6 آرایه قرار دارد.
پیدا کردن عددهای زوج با where
حالا با همان تابع می توانیم همه عددهای زوج را پیدا کنیم. عدد زوج یعنی عددی که بر 2 تقسیم شود و باقی مانده ندهد.
import numpy as np
arr = np.array([1, 2, 3, 4, 5, 6, 7, 8])
x = np.where(arr % 2 == 0)
print(x)
اینجا arr % 2 == 0 یک شرط منطقی است. این شرط می گوید فقط جاهایی را برگردان که عددشان زوج است.
پیدا کردن عددهای فرد با where
تقریباً همان کد را برای عددهای فرد هم داریم. عدد فرد یعنی وقتی بر 2 تقسیم می شود، باقی مانده 1 باشد.
import numpy as np
arr = np.array([1, 2, 3, 4, 5, 6, 7, 8])
x = np.where(arr % 2 == 1)
print(x)
در هر دو مثال، where() فقط اندیس ها را برمی گرداند. اگر خود مقدارها را خواستی، می توانی از همین اندیس ها برای دسترسی به آرایه استفاده کنی.
جستجو در آرایه مرتب با searchsorted
تابع searchsorted() روی آرایه مرتب شده استفاده می شود. این تابع می گوید یک عدد جدید را کجای آرایه بگذاریم تا ترتیب به هم نخورد.
این تابع یک نوع جستجوی دودویی (Binary Search) انجام می دهد. یعنی با چند مقایسه کم، جای درست را پیدا می کند.
import numpy as np
arr = np.array([6, 7, 8, 9])
x = np.searchsorted(arr, 7)
print(x)
در این مثال، خروجی 1 است. یعنی عدد 7 باید در اندیس 1 قرار بگیرد تا ترتیب آرایه درست بماند.
جستجو از سمت راست با searchsorted
پیش فرض تابع searchsorted() این است که از سمت چپ آرایه نگاه می کند. اما می توانیم با پارامتر side='right' از سمت راست حساب کنیم.
import numpy as np
arr = np.array([6, 7, 8, 9])
x = np.searchsorted(arr, 7, side='right')
print(x)
اینجا خروجی 2 است. یعنی اگر از سمت راست حساب کنیم، 7 باید در اندیس 2 قرار بگیرد تا ترتیب حفظ شود.
جستجو برای چند مقدار هم زمان
تابع searchsorted() می تواند چند مقدار را هم زمان بررسی کند. کافی است یک آرایه از مقدارهای موردنظر به آن بدهیم.
import numpy as np
arr = np.array([1, 3, 5, 7])
x = np.searchsorted(arr, [2, 4, 6])
print(x)
خروجی [1 2 3] است. یعنی 2 در اندیس 1، عدد 4 در اندیس 2 و عدد 6 در اندیس 3 قرار می گیرند تا آرایه مرتب بماند.
تمرین عملی جستجو در آرایه در نامپای
برای تمرین، چند کار ساده انجام بده:
- یک آرایه از نمره ها بساز و با
where()اندیس همه نمره های بالای 15 را پیدا کن. - یک آرایه مرتب بساز و با
searchsorted()جای چند نمره جدید را حساب کن. - نتایج را با اضافه کردن مقدارها به آرایه اصلی بررسی کن و ببین ترتیب حفظ می شود یا نه.
اگر یادت رفت تقسیم آرایه ها چگونه بود، صفحه تقسیم آرایه ها (Array Split) را ببین. همچنین برای مرتب سازی بعدی می توانی به صفحه مرتب سازی آرایه ها در نامپای سر بزنی. صفحه جستجو در آرایه در نامپای هم می تواند خلاصه دائمی تو برای این مبحث باشد.
جمع بندی سریع
- جستجو در آرایه در نامپای یعنی پیدا کردن اندیس های مقدارهای خاص.
- تابع
where()اندیس مقدارهایی را برمی گرداند که شرط داده شده را دارند. - تابع
searchsorted()جای درست درج مقدار در آرایه مرتب را می دهد. - پارامتر
sideمشخص می کند از چپ یا راست جستجو انجام شود. - می توان چند مقدار را هم زمان با
searchsorted()بررسی کرد.