当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《稀疏矩阵中非零值的平均值?》经验,为你挑选了2个好方法。

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

>>> 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.])

有没有人可以告诉我,如果有更快的方法?



1> perimosocord..:

使用CSR格式矩阵,您可以更轻松地执行此操作:

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

直接支持行和,并且CSR格式的结构意味着indptr数组中连续值之间的差异与每行中非零元素的数量完全对应.



2> Antonio Raga..:

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

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

返回稀疏矩阵的rows(x),columns(y)和values(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.]

推荐阅读
刘美娥94662
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有