SciPy Sparse Data

داده اسپارس چیست؟

داده اسپارس (sparse data) داده‌ای است که بیشتر عناصر آن بدون استفاده هستند (عناصری که هیچ اطلاعاتی با خود حمل نمی‌کنند). داده اسپارس می‌تواند آرایه‌ای شبیه به آرایه زیر باشد.

[1, 0, 2, 0, 0, 3, 0, 0, 0, 0, 0, 0]
  • داده اسپارس: مجموعه‌ای از داده‌ها که بیشتر مقادیر آن برابر صفر باشد.
  • آرایه چگال: آرایه چگال یا Dense Array در تضاد با آرایه اسپارس، آرایه‌ای است که بیشتر مقادیر آن غیر صفر باشد.

در محاسبات علمی، هنگامیکه با مشتقات جزئی (partial derivatives) سر و کار داریم، به داده‌های اسپارس برخورد می‌کنیم.

نحوه کار کردن با داده‌های اسپارس

SciPy مدولی به اسم scipy.sparse دارد که توابعی را جهت کار با داده‌های اسپارس فراهم می‌کند.

در اصل دو نوع ماتریس اسپارس وجود دارد که با آن‌ها سر و کار خواهیم داشت:

  • CSC یا Compressed Sparse Columns جهت برش دادن ستونی سریع و انجام اعمال اصلی به صورت بهینه.
  • CSR یا Compressed Sparse Rows جهت برش دادن سطری سریع و انجام ضرب برداری به صورت سریع‌تر.

در این آموزش با CSR کار می‌کنیم.

در کد زیر از یک آرایه تعریف شده یک ماتریس اسپارس سطری ایجاد می‌کنیم.


import numpy as np
from scipy.sparse import csr_matrix

arr = np.array([0, 0, 0, 0, 0, 1, 1, 0, 2])

print(csr_matrix(arr))

خروجی:

با توجه به خروجی، متوجه می‌شویم که تنها 3 مقدار غیر صفر وجود دارد:

  • مقدار اول در سطر 0 و مکان 5 با مقدار 1 قرار دارد.
  • مقدار دوم در سطر 0 و مکان 6 با مقدار 1 قرار دارد.
  • مقدار سوم در سطر 0 و مکان 8 با مقدار 2 قرار دارد.

توابع شیء ماتریس اسپارس

با استفاده از خصوصیت data می‌توانیم داده‌های ذخیره شده (داده‌هایی که صفر نیستند) را مشاهده کنیم.


import numpy as np
from scipy.sparse import csr_matrix

arr = np.array([[0, 0, 0], [0, 0, 1], [1, 0, 2]])

print(csr_matrix(arr).data)

خروجی:

تابع شیء count_nonzero() غیر صفرها را می‌شمارد.


import numpy as np
from scipy.sparse import csr_matrix

arr = np.array([[0, 0, 0], [0, 0, 1], [1, 0, 2]])

print(csr_matrix(arr).count_nonzero())

خروجی:

با استفاده از تابع شیء eliminate_zeros() می‌توان عناصری که مقدار آن‌ها برابر صفر است را حذف کرد.


import numpy as np
from scipy.sparse import csr_matrix

arr = np.array([[0, 0, 0], [0, 0, 1], [1, 0, 2]])

mat = csr_matrix(arr)
mat.eliminate_zeros()

print(mat)

خروجی:

تابع شیء tocsc() ماتریس csr را به ماتریس csc تبدیل می‌کند.


import numpy as np
from scipy.sparse import csr_matrix

arr = np.array([[0, 0, 0], [0, 0, 1], [1, 0, 2]])

newarr = csr_matrix(arr).tocsc()

print(newarr)

خروجی:

علاوه بر تمام عملیات‌های خاص ماتریس اسپارس که تا اینجا بیان شد، این ماتریس‌ها از تمامی عملیات‌های ماتریسی نظیر بازآرایی، اعمال اصلی و ... پشتیبانی می‌کنند.