检查Scipy稀疏矩阵的密度

sla*_*law 2 python numpy scipy sparse-matrix

有没有一种很好的方法来测量或检查scipy.sparse矩阵的密度?

例如:

import scipy.sparse
import numpy as np

row  = np.array([0,3,1,0])
col  = np.array([0,3,1,2])
data = np.array([4,5,7,9])

mat = scipy.sparse.coo_matrix((data,(row,col)), shape=(4,4))
print mat.todense()

[[4 0 9 0]
 [0 7 0 0]
 [0 0 0 0]
 [0 0 0 5]]
Run Code Online (Sandbox Code Playgroud)

也许返回的东西可以让我获得总体密度的一般统计信息,例如每行的平均占用率(即第一行占2/4值,第二行占1/4,第三行占0/4,第四行占1/4因此平均占用率/密度将为1/4),stddev,方差等。也许可以采用一种更好的密度度量标准,而该密度度量标准不依赖于矩阵的大小(假设其足够大)。

dan*_*van 8

为了获得简单的密度分数mat(即矩阵中非零元素的分数),我使用类似的东西;

density = mat.getnnz() / np.prod(mat.shape)
Run Code Online (Sandbox Code Playgroud)


Dav*_*ust 7

一种方法是使用该getnnz()方法来识别给定行,列或整个矩阵中非零项目的数量。

让我们从一个稀疏矩阵示例开始sp_mat

sp_mat.todense()

matrix([[0, 1, 1, 1, 1],
        [1, 0, 1, 0, 0]])
Run Code Online (Sandbox Code Playgroud)

整个矩阵中的非零元素计数:

sp_mat.getnnz()
# 6
Run Code Online (Sandbox Code Playgroud)

给定行中的非零元素计数:

sp_mat[0,:].getnnz()
# 4
Run Code Online (Sandbox Code Playgroud)

所有行的非零元素计数:

sp_mat.getnnz(axis=1)
# array([4, 2], dtype=int32)
Run Code Online (Sandbox Code Playgroud)

列中的非零元素计数:

sp_mat[:,1].getnnz()
# 1
Run Code Online (Sandbox Code Playgroud)

所有列的非零元素计数:

sp_mat.getnnz(axis=0)
#  array([1, 1, 2, 1, 1])
Run Code Online (Sandbox Code Playgroud)

可以将其与矩阵的形状进行比较以计算密度:

sp_mat.shape
# (2, 5)
Run Code Online (Sandbox Code Playgroud)