عملیات مجموعه ای با ufunc (ufunc Set Operations)
اینجا می خواهیم عملیات مجموعه ای با ufunc در NumPy را ببینیم؛ یعنی کارهایی مثل اجتماع، اشتراک و تفاضل روی آرایه ها، درست مثل مجموعه های ریاضی در کتاب مدرسه.
مجموعه در NumPy یعنی چه؟
در ریاضی، مجموعه یعنی لیستی از عضوهای یکتا؛ یعنی تکراری ها حذف شده اند.
در منبع هم نوشته مجموعه، «collection of unique elements» است؛ یعنی فقط مقدارهای یکتا نگه داشته می شوند.
در NumPy هم برای شروع عملیات مجموعه ای با ufunc باید از آرایه های یک بعدی استفاده کنیم.
بعداً روی همین آرایه ها اجتماع، اشتراک، تفاضل و تفاضل متقارن را حساب می کنیم.
اگر خواستی تعریف ها را مرور کنی، صفحه عملیات مجموعه ای با ufunc در NumPy همیشه دم دستت است.
ساخت مجموعه با np.unique در NumPy
در منبع گفته شده برای ساخت مجموعه از روی آرایه، از تابع unique() استفاده می کنیم.
تابع np.unique() تمام مقدارهای تکراری را حذف می کند و فقط یکتاها را برمی گرداند.
البته همان طور که در متن آمده، این آرایه باید یک بعدی باشد تا معنی مجموعه را بدهد.
import numpy as np
arr = np.array([1, 1, 1, 2, 3, 4, 5, 5, 6, 7])
x = np.unique(arr)
print(x)
طبق منبع، این کد آرایه را به یک مجموعه تبدیل می کند و مقدارهای تکراری را کنار می گذارد.
یافتن اجتماع با np.union1d
در متن منبع گفته شده برای پیدا کردن اجتماع دو مجموعه از union1d() استفاده می کنیم.
اجتماع یعنی همه عضوهایی که در مجموعه اول، مجموعه دوم یا هر دو وجود دارند.
خروجی np.union1d() خودش هم یک مجموعه مرتب از مقدارهای یکتا است.
import numpy as np
arr1 = np.array([1, 2, 3, 4])
arr2 = np.array([3, 4, 5, 6])
newarr = np.union1d(arr1, arr2)
print(newarr)
همان طور که در مثال منبع نشان داده شده، نتیجه شامل 1، 2، 3، 4، 5 و 6 است.
یافتن اشتراک با np.intersect1d
برای پیدا کردن عضوهایی که در هر دو مجموعه مشترک هستند، منبع از intersect1d() استفاده می کند.
اشتراک یعنی فقط مقدارهایی که در هر دو آرایه دیده می شوند.
تابع np.intersect1d() یک آرایه جدید از همین مقدارهای مشترک برمی گرداند.
import numpy as np
arr1 = np.array([1, 2, 3, 4])
arr2 = np.array([3, 4, 5, 6])
newarr = np.intersect1d(arr1, arr2, assume_unique=True)
print(newarr)
در منبع نوشته شده آرگومان اختیاری assume_unique اگر True باشد، محاسبه را سریع تر می کند.
همچنین تأکید شده هنگام کار با مجموعه ها بهتر است assume_unique=True تنظیم شود.
یافتن تفاضل با np.setdiff1d
در بخش بعدی منبع، تفاضل مجموعه ها را توضیح داده است.
تفاضل یعنی عضوهایی که فقط در مجموعه اول هستند و در مجموعه دوم نیستند.
برای این کار در NumPy از تابع setdiff1d() استفاده می شود.
import numpy as np
set1 = np.array([1, 2, 3, 4])
set2 = np.array([3, 4, 5, 6])
newarr = np.setdiff1d(set1, set2, assume_unique=True)
print(newarr)
در یادداشت منبع آمده که این تابع هم آرگومان assume_unique دارد و برای مجموعه ها باید روی True بماند.
یافتن تفاضل متقارن با np.setxor1d
در آخر، منبع سراغ «تفاضل متقارن» می رود.
تفاضل متقارن یعنی عضوهایی که فقط در یکی از دو مجموعه ظاهر شده اند، نه هر دو.
برای این کار در NumPy از تابع setxor1d() استفاده می شود.
import numpy as np
set1 = np.array([1, 2, 3, 4])
set2 = np.array([3, 4, 5, 6])
newarr = np.setxor1d(set1, set2, assume_unique=True)
print(newarr)
در متن منبع توضیح داده شده که setxor1d() هم آرگومان assume_unique دارد و استفاده از مقدار True کنار مجموعه ها مفید است.
اگر قبل از این فصل، توابع هذلولوی را دیده ای، می توانی دوباره به توابع هذلولوی با ufunc برگردی و مرور کوتاهی انجام بدهی.
تمرین گام به گام با عملیات مجموعه ای با ufunc
برای تمرین چیزهایی که منبع درباره عملیات مجموعه ای با ufunc گفته، این کارها را انجام بده:
- یک آرایه با چند مقدار تکراری بساز و با
np.unique()آن را به مجموعه تبدیل کن. - دو مجموعه کوچک بساز و اجتماع و اشتراک آن ها را با
np.union1d()وnp.intersect1d()حساب کن. - برای همان دو مجموعه، تفاضل و تفاضل متقارن را با
np.setdiff1d()وnp.setxor1d()پیدا کن.
بعد از این تمرین ها، اگر خواستی به مرحله های قبلی برگردی، می توانی کنار توابع مثلثاتی و هذلولوی، کار با مجموعه ها را هم مقایسه کنی.
جمع بندی سریع عملیات مجموعه ای با ufunc
حرف های مهم منبع درباره عملیات مجموعه ای با ufunc در NumPy را این طور خلاصه می کنیم:
np.unique()از روی آرایه یک مجموعه می سازد و تکراری ها را حذف می کند.np.union1d()اجتماع دو مجموعه را برمی گرداند؛ یعنی همه عضوهای موجود در هر دو.np.intersect1d()اشتراک را پیدا می کند و عضوهای مشترک را نشان می دهد.np.setdiff1d()عضوهایی را می دهد که فقط در مجموعه اول هستند.np.setxor1d()تفاضل متقارن را حساب می کند؛ یعنی عضوهایی که فقط در یکی از دو مجموعه دیده می شوند.