رفتن به محتوای اصلی
بازگشت به وبلاگ

داده و اتصال فنی

جلوگیری از تقسیم بر صفر در NumPy با divide و where

اجرای واقعیِ خطای np.where و تقسیمِ ماسک‌دار با out مقداردهی‌شده را ببینید؛ تمام خانه‌ها با if مستقل و چهار حالتِ mask کنترل می‌شوند.

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

منابع در 2026-11-04 خوانده شدند؛ این تاریخ، تاریخ انتشار منبع نیست. مثال‌ها و فایل‌های این راهنما آموزشی و ساختهٔ تحریریه‌اند.

برای این نیاز، کدام خدمت مناسب‌تر است؟

تماس و منشی، چت سایت و تحلیل مکالمه سه مسیر متفاوت‌اند. ابتدا خدمت متناسب نیازتان را انتخاب کنید.

انتخاب میان سه خدمتراهنمای شروع با تیم اپرا

برآورد هزینه