【问题标题】:groupby on sparse matrix with scipy使用 scipy 对稀疏矩阵进行分组
【发布时间】:2015-07-28 06:25:00
【问题描述】:

我用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,...]

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

我该怎么办?当然,我所有的东西都需要适合内存,所以我不得不对S使用稀疏矩阵。

【问题讨论】:

  • 演示你想用一对小数组做什么。那我们就可以想一想它怎么适应稀疏的了。

标签: python numpy matrix scipy sparse-matrix


【解决方案1】:

如果索引正在增加(如您的示例所示),您可以在列表的 enumerate 上使用 itertools.groupby。对于每个组,使用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 具有广泛的实用程序来对此类列表进行切片和索引。

【讨论】:

  • 很抱歉,您的代码中没有看到S?分组在A,但我要分组的数据在S
  • 嗯,是的,它“隐藏”在... 中。这就是我建议您将访问 S 的代码放在此处。
  • 很抱歉,我自己搞不定。我阅读了 10 次 groupby 文档。
  • 看看澄清对你有没有帮助。
猜你喜欢
  • 1970-01-01
  • 2016-05-26
  • 1970-01-01
  • 2013-10-11
  • 2018-08-21
  • 1970-01-01
  • 1970-01-01
  • 2013-12-03
  • 2017-03-20
相关资源
最近更新 更多