在 scipy 的稀疏矩阵上分组

groupby on sparse matrix with scipy

我用 sklearn.preprocessing.OneHotEncoder() 构建了一个 scipy 稀疏矩阵 S。矩阵 S 有 10^6 行,500 列。

我还有一个 numpy 数组 A,其中包含 10^6 个值,如下所示:

A = [1,1,2,2,2,3,4,5,6,6,7,8,8,8,...]

我想在稀疏矩阵 S 上按照数组 A 中写入的组进行分组,并使用 numpy.sum() 作为聚合函数。

我该怎么办?当然,我所有的东西都需要放在内存中,所以我不得不为 S.

使用稀疏矩阵

如果指数在增加(从你的例子看来),你可以使用 itertools.groupby on an enumerate of the list. For each group, use numpy's indexing.

循环可能如下所示:

import itertools
import operator

for g, inds in itertools.groupby(enumerate(A), key=operator.itemgetter(1)):
    ...

... 应该替换为可以用 S 执行任何操作的代码。要了解原因,请注意以下示例:

for g, inds in itertools.groupby(enumerate(A), key=operator.itemgetter(1)):
     print g, list([i[0] for i in inds])

产生

1 [0, 1]
2 [2, 3, 4]
3 [5]
4 [6]
5 [7]
6 [8, 9]
7 [10]
8 [11, 12, 13]

可以看出第一项是组,第二项是索引列表。 Numpy 具有广泛的实用程序,可以在给定此类列表的情况下进行切片和索引。