我有一个coo格式的稀疏矩阵:
from scipy.sparse import coo_matrix
data = np.asarray([[1, 0, 0], [.8, .2, 0], [0, 1, 0], [0.4, 0.3, 0.3]])
data
array([[1. , 0. , 0. ],
[0.8, 0.2, 0. ],
[0. , 1. , 0. ],
[0.4, 0.3, 0.3]])
sparse_matrix = coo_matrix(data)
对于每一列,我都有一个群集分配,我想对按其群集分配分组的行求和。在此操作期间,我想保持稀疏格式以解决内存问题。
示例:
labels = ["a", "b", "b"]
预期输出:
1, 0
.8, .2
0, 1
.4, .6
答案 0 :(得分:0)
可以使用密集数组来进行处理-对于每个组,选择所需的列并求和。收集结果。
In [2]: data = np.asarray([[1, 0, 0], [.8, .2, 0], [0, 1, 0], [0.4, 0.3, 0.3]])
In [3]: M = sparse.csc_matrix(data)
In [4]: M
Out[4]:
<4x3 sparse matrix of type '<class 'numpy.float64'>'
with 7 stored elements in Compressed Sparse Column format>
In [5]: M.A
Out[5]:
array([[1. , 0. , 0. ],
[0.8, 0.2, 0. ],
[0. , 1. , 0. ],
[0.4, 0.3, 0.3]])
In [6]: M[:,[0]].sum(axis=1)
Out[6]:
matrix([[1. ],
[0.8],
[0. ],
[0.4]])
In [7]: M[:,[1,2]].sum(axis=1)
Out[7]:
matrix([[0. ],
[0.2],
[1. ],
[0.6]])
In [8]: res = np.concatenate((Out[6], Out[7]), axis=1)
In [9]: res
Out[9]:
matrix([[1. , 0. ],
[0.8, 0.2],
[0. , 1. ],
[0.4, 0.6]])
请注意,sum
产生密集的np.matrix
。我认为sparse
通常会这样做,因为这样的总和总是比源的密度大。仅当所有元素均为0时,总和才为0(少数情况下,一堆非零相互抵消)。
由于列索引和总和都被实现为矩阵乘积,因此可以通过构造一个同时执行两个动作的矩阵来加快处理速度。但这是一个实现细节。
稀疏矩阵的索引编制非常慢(与密集矩阵相比)。