np.where شرط را برای انتخابِ مقدار به کار میبرد، اما عبارتهای ورودیِ آن پیش از فراخوانی ارزیابی میشوند. بنابراین نوشتنِ «اگر مخرج ناصفر است» دورِ یک تقسیم، لزوماً جلوی اجرایِ تقسیم بر صفر را نمیگیرد. راهِ متفاوت، where خودِ ufunc همراه با خروجیِ ازپیشمقداردهیشده است؛ دو معنایِ where را جدا آزمایش میکنیم.
سه مخرج، یک شاخهٔ ظاهراً محافظتشده
آرایهٔ اصیل x=[−۲، ۰، ۴] از نوع float64 است. میخواهیم فقط برای مخرجِ ناصفر معکوس بسازیم و جای دیگر علامتِ قراردادیِ−۹۹۹ بماند. این علامت اندازهگیری یا صفر نیست؛ فقط در همین تمرین، مسیرِ اجرانشده را قابلِ دیدن میکند.
np.where(x != 0, 1 / x, -999)در errstate با divide و invalid برابرِ raise، این خط واقعاً FloatingPointError میدهد. عبارت ۱/x پیش از آنکه np.where مقدارِ هر خانه را انتخاب کند اجرا شده است. نتیجهٔ ظاهراً درستِ بعضی خانهها یا خاموشکردنِ warning، معنایِ حفاظتِ شاخه را عوض نمیکند.
آرگومانها قبل از خودِ تابع میآیند
تمرینِ جدا سه تابعِ ثبتکننده برای condition و xbranch و ybranch دارد. حتی با شرطِ همهFalse، هر سه واقعاً فراخوانی میشوند و ترتیبِ ثبتشده همین است. آن شاهد از عددهایِ ازپیشساخته استفاده میکند؛ تقسیمِ نامعتبرِ دیگری را پنهان یا اجرا نمیکند.
این رفتارِ ارزیابیِ آرگومانِ Python را نباید با اجرایِ شرطیِ یک ufunc یکی دانست. همین نامِ where در محلهای مختلف، معنایِ اجراییِ متفاوت دارد. broadcasting سازگاریِ شکل را روشن میکند، اما شکلِ صحیح تضمین نمیکند همهٔ عملیاتِ داخلِ آرگومانها مجاز باشند.
خروجی را اول روشن و بعد ماسک کنیم
out = np.full(x.shape, -999., dtype=np.float64)
np.divide(1., x, out=out, where=(x != 0))خروجیِ واقعی[−۰٫۵، −۹۹۹، ۰٫۲۵] است. در خانهٔ وسط، mask برابر False و out از قبل مقدار دارد؛ همان مقدار حفظ میشود. در دو خانهٔ دیگر تقسیم انجام شده است. مرجعِ مستقل با if اسکالر، فقط هنگامِ شرطِ True تقسیم میکند و هر خانه را مقایسه میکند.
| مخرج | mask | خروجیِ مقداردهیشده |
|---|---|---|
| −۲ | True | −۰٫۵ |
| ۰ | False | −۹۹۹، علامتِ قراردادی |
| ۴ | True | ۰٫۲۵ |
خانهٔ نوشتهنشده را اندازهگیری نکنیم
مستندِ divide توضیح میدهد وقتی out تازه و بدون مقداردهی ساخته شود، خانههایِ False ممکن است مقداردهینشده بمانند. تمرینِ ما هرگز آن حافظه را برای نتیجهٔ ثابت نمیخواند. مقدارِ تصادفیِ یک اجرایِ خاص، سیاستِ مقدارِ گمشده یا خروجیِ معتبر نمیشود.
چهار حالتِ واقعیِ تمامTrue، تمامFalse، ترکیبی و مخرجِ منفی کنترل شدهاند. در همه، خانههایِ False با snapshot out اولیه برابرند. تمامFalse یعنی هیچ خانهٔ تقسیمِ ufunc نوشته نمیشود؛ به معنیِ اجرانشدنِ توابعی که آرگومان را قبلاً ساختهاند نیست.
قراردادِ محدود، پیش از محاسبه کنترل میشود
هفت ورودیِ ناسازگار، از out با dtype یاشکلِ غلط تا mask غیربولین، NaN، صفرِ دارای maskTrue، حافظهٔ مشترک واندازهٔ زیاد رد میشوند. پوشش فقط بردارِ یکبعدیِ ۱ تا ۸ عضو، ورودیِ متناهی باقدرِ حداکثر یکمیلیون و قدرِ مخرجِ ناصفر حداقل یکمیلیونیم است. این سیاستِ آموزشی همهٔ قراردادهایِ NumPy نیست.
اجرا با NumPy۲٫۳٫۵ انجام شده و هیچ مدل، فایل یا دادهٔ مشتری ندارد. تبدیلِ غیرخطیِ sparse دربارهٔ صفرِ ضمنی و ترتیبِ ادغام است؛ اینجا زمانِ اجرایِ عملیات و مقصدِ نوشتهشدن موضوعاند. برای ادامه در مبانی هوش مصنوعی، سیاستِ mask و مقدارِ غایب را پیش از سنجشِ خروجی روشن کنید؛ این کد شکلِ داخلیِ محصولِ اپرا را اعلام نمیکند.
فایل تمرین و منبع
کد کاملِ تمرینِ مستقل و کنترلها؛ Python · ورودی و تمامِ خروجیِ اجرای واقعی؛ JSON
- تعریفِ رسمیِ انتخابِ سهآرگومانی و شکلهای broadcast شونده خوانده شد
- تعریفِ ufunc، out و where و هشدارِ خانههای مقداردهینشده خوانده شد؛ اجرای ۲٫۳٫۵
- بخشِ Calls؛ ارزیابیِ عبارتهای آرگومان پیش از فراخوانی واقعاً خوانده شد
منابع در 2026-11-04 خوانده شدند؛ این تاریخ، تاریخ انتشار منبع نیست. مثالها و فایلهای این راهنما آموزشی و ساختهٔ تحریریهاند.