繁体   English   中英

稀疏矩阵中非零值的平均值?

[英]Mean of non zero values in sparse matrix?

我正在尝试计算稀疏行矩阵每一行中非零值的平均值。 使用矩阵的均值方法不会这样做:

>>> from scipy.sparse import csr_matrix
>>> a = csr_matrix([[0, 0, 2], [1, 3, 8]])
>>> a.mean(axis=1)
matrix([[ 0.66666667],
        [ 4.        ]])

以下工作但对于大型矩阵很慢:

>>> import numpy as np
>>> b = np.zeros(a.shape[0])
>>> for i in range(a.shape[0]):
...    b[i] = a.getrow(i).data.mean()
... 
>>> b
array([ 2.,  4.])

谁能告诉我是否有更快的方法?

使用 CSR 格式矩阵,您可以更轻松地做到这一点:

sums = a.sum(axis=1).A1
counts = np.diff(a.indptr)
averages = sums / counts

直接支持行和,CSR 格式的结构意味着indptr数组中连续值之间的差异正好对应于每行中非零元素的数量。

这似乎是您可以使用numpy.bincount.的典型问题numpy.bincount. 为此,我使用了三个函数:

(x,y,z)=scipy.sparse.find(a)

返回稀疏矩阵的行( x )、列( y )和值( z )。 例如, xarray([0, 1, 1, 1].

numpy.bincount(x)返回,对于每个行号,你有多少非零元素。

numpy.bincount(x,wights=z)为每一行返回非零元素的总和。

最终的工作代码:

from scipy.sparse import csr_matrix
a = csr_matrix([[0, 0, 2], [1, 3, 8]])

import numpy
import scipy.sparse
(x,y,z)=scipy.sparse.find(a)
countings=numpy.bincount(x)
sums=numpy.bincount(x,weights=z)
averages=sums/countings

print(averages)

返回:

[ 2.  4.]

我总是喜欢对您感兴趣的任何轴上的值求和,然后除以相应行/列中非零元素的总数。

像这样:

sp_arr = csr_matrix([[0, 0, 2], [1, 3, 8]])
col_avg = sp_arr.sum(0) / (sp_arr != 0).sum(0)
row_avg = sp_arr.sum(1) / (sp_arr != 0).sum(1)
print(col_avg)
matrix([[ 1.,  3.,  5.]])
print(row_avg)
matrix([[ 2.],
        [ 4.]])

基本上,您将沿给定轴的所有条目的总值求和,然后除以矩阵 != 0(即实际条目的数量)的True条目的总和。

我发现这种方法比其他选项更简单也更简单。

返回平均值列表的简单方法:

a.sum(axis=0) / a.getnnz(axis=0)

假设您的矩阵中没有任何明确的零。 如果愿意,请更改轴。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM