خزّن فقط ما ليس صفرًا
كثير من المصفوفات الكبيرة أصفار تقريبًا. شبكة تسعير خيار فيها صف لكل مستوى سعر ويلمس كل صف جاريه فقط. تسمى مثل هذه المصفوفة متفرقة. وتخزين كل صفر يهدر الذاكرة والوقت. تحتفظ scipy.sparse بالعناصر غير الصفرية فقط. وتستعمل الصيغة csr_matrix (الصف المتفرق المضغوط) ثلاث قوائم. تحمل data القيم غير الصفرية صفًا صفًا، وتحمل indices عمود كل قيمة، وتبين indptr أين يبدأ كل صف وينتهي داخل data: الصف هو data[indptr[i]:indptr[i+1]]. وآخر رقم في indptr هو عدد غير الأصفار nnz.
تناسب الصيغ المختلفة أعمالًا مختلفة. تخزن coo_matrix ثلاثيات بسيطة (صف وعمود وقيمة) وهي الطريقة السهلة لبناء مصفوفة. وتسرع csr_matrix في قص الصفوف وفي الجداء الذي يكلف نحو nnz عملية ضرب بدل . وcsc_matrix الفكرة نفسها بالأعمدة، وdia_matrix تخزن الأقطار وهي مثالية للمصفوفات الشريطية. ولنظام تستفيد sparse.linalg.spsolve من الأصفار فتكون أسرع بكثير من الحل الكثيف. وليس التفرق أفضل دائمًا: إذا زادت العناصر غير الصفرية على الثلث تقريبًا كلّف الحساب الإضافي أكثر مما يوفر. وفي المالية يظهر التفرق في شبكات التسعير وفي نماذج العوامل التي أغلب تحميلاتها صفر وحين تحتفظ بالارتباطات القوية فقط.
data=[5,1,2,3,4] وindices=[0,3,2,0,3] وindptr=[0,2,3,3,5]. الصف فارغ لأن indptr[2]=indptr[3]=3 وnnz=5. والضرب في يجمع كل صف فيعطي بـ عمليات ضرب فقط. ولمصفوفة ثلاثية القطر بـ كشبكة تسعير بالفروق المنتهية عنصرًا غير صفري من أصل أي كثافة . وتحتاج نحو كيلوبايت في CSR مقابل ميغابايت كثيفة. وفي بيانات حقيقية تشكل ارتباطات سهمًا من ملف الأسعار المشترك مصفوفة . والاحتفاظ بالعناصر ذات فقط يُبقي من أي وتأخذ نسخة CSR كيلوبايت مقابل كثيفة. وعند يبقى فقط.- ثلاث قوائم:
dataوindicesوindptrتصف مصفوفة CSR، وindptr[-1]هو عدد غير الأصفار. - ابنِ بـ COO واحسب بـ CSR: الثلاثيات سهلة التجميع والتخزين بالصفوف سريع للجداءات والحلول.
- التفرق يفيد فقط إذا كان أغلبها أصفارًا: المصفوفة الكثيفة أفضل حين تكثر العناصر غير الصفرية.
المختبر: ما الذي يُقيَّم
- عدّ غير الأصفار10 نقطة
- كم قيمة في صف10 نقطة
- كثافة شبكة10 نقطة
- جداء متفرق15 نقطة
- أي صيغة لأي عمل15 نقطة
- نظام ثلاثي القطر10 نقطة
- متى يفيد التفرق ومتى لا30 نقطة