ساخت تابع ufunc (ufunc Create Function)
در این صفحه با ساخت تابع ufunc در NumPy آشنا می شوی. یعنی خودت یک تابع معمولی پایتونی می نویسی و بعد با کمک frompyfunc() آن را تبدیل به ufunc مخصوص آرایه های NumPy می کنی.
چطور تابع خودمان را به ufunc تبدیل کنیم؟
در منبع گفته شده برای ساخت تابع ufunc در NumPy، اول یک تابع معمولی تعریف می کنی. بعد با متد frompyfunc() آن را به کتابخانه ufunc ها اضافه می کنی.
متد frompyfunc() سه آرگومان می گیرد که منبع دقیقاً این طور گفته است:
function: نام تابع معمولی که قبلاً تعریف کردی.inputs: تعداد ورودی ها (مثلاً چند آرایه می گیرد).outputs: تعداد خروجی ها (چند آرایه برمی گرداند).
نکته: شبیه این است که یک معلم خصوصی بنویسی و بعد به NumPy بگویی: «این هم معلم جدید من، با این تعداد ورودی و خروجی!».
مراحل ساخت تابع ufunc در NumPy
طبق متن منبع، می توانیم مراحل ساخت تابع ufunc در NumPy را خیلی ساده این طور خلاصه کنیم:
- یک تابع معمولی پایتون مثل
myaddتعریف کن. - با
np.frompyfunc(myadd, تعداد_ورودی، تعداد_خروجی)آن را تبدیل کن. - این ufunc جدید را روی لیست ها و آرایه ها صدا بزن.
حالا مثال منبع را با همین ایده می بینیم.
مثال: ساخت ufunc برای جمع کردن
در مثال منبع، یک تابع ساده برای جمع دو عدد ساخته شده است. سپس با frompyfunc() آن را به یک تابع ufunc تبدیل می کنند که می تواند روی لیست ها کار کند.
import numpy as np
def myadd(x, y):
return x + y
myadd = np.frompyfunc(myadd, 2, 1)
print(myadd([1, 2, 3, 4], [5, 6, 7, 8]))
نکته: بعد از تبدیل، نام myadd دیگر یک تابع معمولی نیست، بلکه یک ufunc است که روی هر عنصر دو لیست به صورت برداری جمع را انجام می دهد.
چطور بفهمیم یک تابع ufunc است؟
در منبع گفته شده می توانی با تابع type() بررسی کنی که یک تابع، ufunc هست یا نه. اگر نتیجه <class 'numpy.ufunc'> باشد، یعنی آن تابع یک ufunc است.
مثلاً تابع np.add یک ufunc است و نوع آن باید همین کلاس باشد.
import numpy as np
print(type(np.add))
در مقابل، بعضی از توابع NumPy ufunc نیستند، مثل concatenate که برای چسباندن چند آرایه است.
import numpy as np
print(type(np.concatenate))
نکته: اگر نام تابع اشتباه نوشته شود و اصلاً وجود نداشته باشد، طبق مثال منبع، type() خطا برمی گرداند.
import numpy as np
print(type(np.blahblah))
استفاده از if برای تست ufunc بودن
در انتهای منبع، راهی برای استفاده در شرط if پیشنهاد شده است. می توانی نوع تابع را با np.ufunc مقایسه کنی.
اگر مساوی بود، یعنی آن تابع واقعاً ufunc است؛ اگر نبود، می توانی پیام دیگری چاپ کنی.
import numpy as np
if type(np.add) == np.ufunc:
print('add is ufunc')
else:
print('add is not ufunc')
نکته: این الگو کمک می کند وقتی در پروژه بزرگ کار می کنی، مطمئن شوی تابعی که استفاده می کنی واقعاً یک ufunc در NumPy است.
جمع بندی سریع ساخت تابع ufunc
برای مرور ساخت تابع ufunc در NumPy، این چند نکته مهم را به خاطر بسپار:
- برای ساخت تابع ufunc در NumPy از
frompyfunc()استفاده می شود. - این متد نام تابع، تعداد ورودی و خروجی را می گیرد.
- برای تشخیص ufunc بودن،
type()بایدnumpy.ufuncبرگرداند. - توابعی مثل
np.addufunc هستند، اماnp.concatenateنیست. - در شرط
ifمی توانی باnp.ufuncتست کنی که تابع واقعاً ufunc است.