خطای allow_pickle=False در np.load همیشه به معنی خرابشدن فایل NPY نیست؛ ممکن است آرایه از نوع object باشد و payload آن به pickle وابسته باشد. تغییر بیفکر گزینه به True، مرز بارگذاری را عوض میکند. در این صفحه دو فایل کوچکِ اصیل در حافظه میسازیم: آرایهٔ عددی با False باز میشود و object-array با همان سیاست واقعاً رد میشود. هیچ pickle بارگذاری نمیکنیم.
NPY فقط یک پسوندِ عددی نیست
قالب NPY برای ذخیرهٔ یک آرایه، اطلاعات شکل و dtype را نگه میدارد. در مستند NumPy، payload آرایهٔ معمولی بایتهای پیوستهٔ داده است؛ اما اگر dtype دارای Python object باشد، داده به شکل pickle آرایه ذخیره میشود. پس دو فایل با پسوند یکسان میتوانند از نظر مسیر خواندن متفاوت باشند.
دادهٔ متنی نیز الزاماً object نیست؛ نوع دقیق آرایه اهمیت دارد. این تمرین قرار نیست از روی نام ستون یا پسوند، نوع همهٔ فایلها را حدس بزند. ابتدا از سازندهٔ نمونه میدانیم چه چیزی ساختهایم و سپس رفتار loader موجود را مشاهده میکنیم؛ فایل ناشناس برای آزمایش انتخاب نشده است.
مسیر عددی را با انتظار دقیق بسنجیم
آرایهٔ اول شکل [2,2] و dtype برابرِ little-endian F32 دارد. مقدارهای آن ۱٫۵، ۲٫۵، ۳٫۵ و ۴٫۵ هستند. با np.save و allow_pickle=False داخل BytesIO ذخیره میشود؛ بعد یک BytesIO تازه از همان بایتها به np.load داده میشود. استفاده از حافظه، نیاز به بازکردن مسیر فایلِ خصوصی را از تمرین حذف میکند.
loader با allow_pickle=False و max_header_size برابرِ۱۰۲۴ فراخوانی میشود. پس از خواندن، dtype، شکل و تکتک مقدارها با آرایهٔ مورد انتظار مقایسه میشوند. نتیجه واقعاً برابر است؛ فقط نبودِ exception معیار موفقیت نیست. فایل عددیِ ساختهشده ۱۴۴ بایت دارد و هش آن در گزارش ثبت شده است.
object-array چرا رد میشود؟
آرایهٔ دوم دو عضوِ بیخطر و ساختهٔ نویسنده دارد: یک dict با برچسب authored و یک list شامل a و b. dtype را صریحاً object گذاشتهایم. برای ساخت همین fixture، np.save با allow_pickle=True اجرا میشود؛ این مرحله نوشتنِ objectهای معلومِ خودمان است و به معنی خواندن یک pickle دریافتی نیست.
سپس تنها تلاشِ خواندن با allow_pickle=False انجام میشود. ValueError واقعی با متنِ «Object arrays cannot be loaded when allow_pickle=False» ثبت شده است. این شکست، همان انتظارِ قرارداد است؛ برای خاموشکردن آن، مسیر دومِ بارگذاری با True اضافه نشده است. گزارش صریحاً any_pickle_loaded_or_unknown_file_opened را false نگه میدارد.
چهار مشاهده را جدا گزارش کنیم
| ویژگی | نمونهٔ عددی | نمونهٔ object |
|---|---|---|
| شکل | [2,2] | [2] |
| مسیرِ داده | بایتهای آرایهٔ عددی | payload مبتنی بر pickle |
| خواندن با False | بازسازیِ دقیق | ردِ واقعی |
| تغییر به True برای رفع خطا | لازم نشد | انجام نشد |
پذیرفتهشدن یک فایل عددی با False به معنی بیخطر بودنِ همهٔ فایلهای NPY نیست. اندازهٔ داده، منابع مورد نیاز، نسخهٔ parser و محیط اجرا همچنان مسئلهاند. از یک flag نباید تضمین امنیت کامل یا درستبودنِ معنای مقدارها استخراج کنیم.
سقفِ سرآیند هم بخشی از قرارداد است
مستند np.load، max_header_size را برای محدودکردن اندازهٔ header توضیح میدهد. در تمرین مقدارِ۱۰۲۴ را صریح گذاشتهایم و نمونهٔ کوچک از آن عبور میکند. این عدد حدِ پیشنهادی برای همهٔ پروژهها نیست؛ اگر schema مشروعی header بزرگتر دارد، تصمیم باید با نیاز و محیط مجاز بررسی شود، نه با برداشتنِ بیتوضیحِ همهٔ محدودیتها.
منبع همچنین میگوید در حالتِ اجازهٔ pickle، سیاست این حد متفاوت است. بنابراین تغییر flag فقط «قبولکردن یک نوع دادهٔ دیگر» نیست؛ دامنهٔ اعتمادِ loader را هم عوض میکند. این مقاله روش پردازش فایل ناشناس در محیط عملیاتی یا راه دورزدنِ سیاستِ دریافت فایل را ارائه نمیکند.
نسخه و مسیر جایگزین را ثبت کنیم
اجرای واقعی با Python ۳٫۱۲٫۱۴ و NumPy ۲٫۳٫۵ موجود انجام شده؛ مستند نسخهٔ۲٫۳ خوانده شده است. هیچ کتابخانهای نصب، مدل یا وزن دانلود و فایل مشتری باز نشده است. شکل، dtype، خطای واقعی و نتیجهٔ مقایسه برای تکرارِ همین آزمایش در JSON آمدهاند؛ حجم فایلها نتیجهٔ کیفیت یا سرعت محصول نیست.
راهنمای فایل ورودیِ نامطمئن دربارهٔ دامنهٔ اجرای محدود است و بررسی دانلود منبع و نسخه را ثبت میکند. برای ادامه در مبانی هوش مصنوعی، ابتدا روشن کنید واقعاً به object نیاز دارید یا قراردادِ آرایهٔ عددی کافی است. این انتخاب، تصمیمِ نوعِ داده است؛ وجودِ پشتیبانیِ NPY یا pickle در سرویس اپرا از این تمرین نتیجه نمیشود.
فایل تمرین و منبع
کد کامل تمرینِ محلی و کنترلهای آن · نمونههای اصیل و نتیجهٔ اجرای واقعیِ همین کد
- مستند رسمی NumPy۲٫۳، allow_pickle، max_header_size و خطای object-array؛ بخشهای مرتبط
- مستند NPY نسخهٔ۲٫۳، هدف قالب و تفاوت payload عددی با object/pickle؛ بخشهای مرتبط
منابع در 2026-11-04 خوانده شدند؛ این تاریخ، تاریخ انتشار منبع نیست. مثالها و فایلهای این راهنما آموزشی و ساختهٔ تحریریهاند.