CSR یا ذخیرهسازیِ فشردهٔ سطری، جایِ دادههایِ یک ماتریس را با سه آرایه و شکلِ ماتریس مشخص میکند. data مقدارها، indices ستونِ هر مقدار و indptr مرزِ سطرهاست. این راهنما یک ماتریسِ چهارسطری را بازسازی میکند؛ سطرِ خالی، صفرِ صریح و ستونِ تکراری را هم عمداً در ورودی گذاشتهایم تا قرارداد مبهم نماند.
چهار آرایه/مشخصهای که باید کنارِ هم بمانند
shape = [4, 5]
data = [2, 0, 3, 4, -1, 5]
indices = [0, 4, 1, 1, 3, 0]
indptr = [0, 2, 2, 5, 6]همهٔ شاخصها صفرمبنا هستند. برایِ سطرِ i، رکوردهایِ بینِ indptr[i] و indptr[i+1] را میخوانیم؛ ابتدا داخلِ بازه و انتها خارج از آن است. تعدادِ اشارهگرها باید یک عدد بیشتر از تعدادِ سطرها باشد. شکلِ۴×۵ حتی وقتی سطر یا ستونِ آخر دادهٔ ذخیرهشده ندارد، باید حفظ شود.
سطرِ خالی را با دو اشارهگرِ برابر ببینیم
| سطرِ صفرمبنا | بازهٔ رکورد | ستونها | مقدارها | ردیفِ بازسازیشده |
|---|---|---|---|---|
| ۰ | [۰،۲) | ۰،۴ | ۲،۰ | [۲،۰،۰،۰،۰] |
| ۱ | [۲،۲) | خالی | خالی | [۰،۰،۰،۰،۰] |
| ۲ | [۲،۵) | ۱،۱،۳ | ۳،۴،−۱ | [۰،۷،۰،−۱،۰] |
| ۳ | [۵،۶) | ۰ | ۵ | [۵،۰،۰،۰،۰] |
برابرِ۲بودنِ دو اشارهگرِ پیاپی، سطرِ۱ را حذف نمیکند؛ فقط میگوید این سطر هیچ رکوردی ندارد. اگر یکی از این اشارهگرها را برداریم، دیگر معلوم نیست رکوردها به کدام سطر تعلق دارند. بازساز ابتدا چهار ردیفِ پنجخانهایِ صفر میسازد و فقط بازههایِ مشخصشده را پر میکند.
اندیسِ تکراری را جمع کنیم یا آخرین مقدار را نگه داریم؟
قراردادِ این تمرین صریحاً جمع است: در سطرِ۲، دو رکوردِ ستونِ۱ با مقدارهایِ۳و۴ به۷ میرسند. تبدیلِ ساده به دیکشنری با جایگزینیِ آخرین مقدار، ممکن بود۴ را نگه دارد و پاسخ را عوض کند. فایلِ ما هر رکورد را به خانهٔ متناظر اضافه میکند. این رفتار، اجرایِ SciPy نیست؛ قراردادِ آموزشیِ مشخص و آزمودهشده است.
قالبِ canonical در مرجعِ SciPy به مرتببودنِ شاخصها در هر سطر و نبودِ تکرار نیاز دارد. ورودیِ ما بهخاطرِ دو ستونِ۱ در سطرِ۲ canonical نیست، هرچند بازسازی با قراردادِ جمع، جوابِ مشخص دارد. کد فقط این ویژگی را گزارش میکند و آرایهٔ ذخیرهسازی را خودکار مرتب یا ادغام نمیکند.
تعدادِ رکورد با تعدادِ عددِ ناصفر فرق دارد
اینجا شش رکورد ذخیره شده، اما پس از جمعِ تکرارها فقط چهار خانهٔ عددیِ ناصفر داریم. یک رکورد، صفرِ صریحِ ستونِ۴ در سطرِ۰ است و دو رکورد هم یک خانه را میسازند. از نامِ nnz در یک API، بدونِ خواندنِ قرارداد، تعدادِ ناصفرِ نهایی را حدس نزنید. اگر مقدارهایِ تکراری همدیگر را خنثی کنند، این فاصله میتواند بیشتر شود.
در این قرارداد، خانهٔ ذخیرهنشده صفر است؛ مقدارِ نامعلوم یا missing نیست. هیچ محاسبهٔ حافظه، سرعت یا نسبتِ فشردهسازی انجام نشده است. حتی بازسازیِ متراکمِ این کد فقط برایِ چهار سطرِ کوچک مناسبِ تمرین است و توصیهٔ تبدیلِ دادهٔ بزرگ به ماتریسِ کامل نیست.
یک عملیاتِ قابلِ کنترل و شش ورودیِ ردشده
برایِ بردارِ[۱،۲،۳،۴،۵]، ضربِ ماتریس در بردار به[۲،۰،۱۰،۵] میرسد. سطرِ۲ مقدارِ۷×۲−۱×۴=۱۰ میدهد. آزمون، بازسازیِ تمامِ بیست خانه و این چهار خروجی را با انتظارِ مستقل مقایسه میکند؛ فقط شمارِ رکوردها بررسی نشده است.
اشارهگرِ کوتاه، شروعِ غیرصفر، کاهشِ اشارهگر، پایانِ ناسازگار با طولِ داده، ستونِ خارج از محدوده و bool بهجایِ شاخص، شش حالتِ واقعاً ردشدهاند. اشارهگرها باید صحیح، یکنوا و دارایِ پایانِ برابر با طولِ data و indices باشند؛ داده هم در این فایل عددِ متناهی میخواهد. شکلِ صفربعدی یا ماتریسِ خالی خارج از قراردادِ همین ابزار است، نه ممنوعیتِ عمومیِ CSR.
فرقِ این سؤال با «بردارِ پراکنده یا متراکم»
راهنمایِ بردارِ پراکنده و متراکم یک بردار و حسابِ بایت را توضیح میدهد؛ اینجا مرزِ چند سطر و رفتارِ indptr را با دادهٔ واقعیِ تمرین اجرا کردیم. برایِ معنایِ ضرب، بردار و ماتریس مکمل است. در انتخابِ چتِ سایتِ اپرا، کیفیتِ پاسخ و اسنادِ مجاز را جدا بررسی کنید؛ این مقاله شیوهٔ ذخیرهسازیِ محصول را اعلام نمیکند.
فایل تمرین و منبع
بازسازیِ چهار سطر، جمعِ تکرار و شش کنترلِ ورودی؛ Python · آرایهها، بازهٔ هر سطر و تفاوتِ۶رکورد با۴ناصفر
منابع در 2026-11-04 خوانده شدند؛ این تاریخ، تاریخ انتشار منبع نیست. مثالها و فایلهای این راهنما آموزشی و ساختهٔ تحریریهاند.