我正在尝试计算稀疏行矩阵的每一行中的非零值的平均值.使用矩阵的均值方法不会这样做:
>>> 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.
.为此我使用了三个函数:
(x,y,z)=scipy.sparse.find(a)
返回稀疏矩阵的rows(x
),columns(y
)和values(z
).对于实例,x
是array([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.]