我应该如何从scipy.sparse.csr.csr_matrix和列表中进行子采样

时间:2014-04-06 20:35:10

标签: python numpy scikit-learn

我有scipy.sparse.csr.csr_matrix表示文档中的单词和列表列表,其中每个索引表示矩阵中每个索引的类别。

我遇到的问题是我需要从数据中随机选择N行。

所以如果我的矩阵看起来像这样

[1:3 2:3 4:4]
[1:5 2:5 5:4]

我的列表列表看起来像这样

((20,40) (80,50))  

我需要对1个值进行采样,我最终可以使用此

[1:3 2:3 4:4]
((20,40))

我搜索了scipy文档但我找不到使用索引列表生成新csr矩阵的方法。

1 个答案:

答案 0 :(得分:5)

您可以使用索引列表简单地索引csr矩阵。首先我们创建一个矩阵,并查看它:

>>> m = csr_matrix([[0,0,1,0], [4,3,0,0], [3,0,0,8]])
<3x4 sparse matrix of type '<type 'numpy.int64'>'
    with 5 stored elements in Compressed Sparse Row format>

>>>  print m.toarray()
[[0 0 1 0]
 [4 3 0 0]
 [3 0 0 8]]

当然,我们可以轻松地看到第一行:

>>> m[0]
<1x4 sparse matrix of type '<type 'numpy.int64'>'
    with 1 stored elements in Compressed Sparse Row format>

>>> print m[0].toarray()
[[0 0 1 0]]

但我们也可以使用列表[0,2]作为索引一次查看第一行和第三行:

>>> m[[0,2]]
<2x4 sparse matrix of type '<type 'numpy.int64'>'
    with 3 stored elements in Compressed Sparse Row format>

>>> print m[[0,2]].toarray()
[[0 0 1 0]
 [3 0 0 8]]

现在,您可以使用numpy的N生成choice随机索引而不重复(无替换):

i = np.random.choice(np.arange(m.shape[0]), N, replace=False)

然后,您可以从原始矩阵m中获取这些索引:

sub_m = m[i]

要从列表的类别列表中获取它们,必须先将其设为数组,然后使用列表i进行索引:

sub_c = np.asarray(categories)[i]

如果您想要一个列表列表,请使用:

sub_c.tolist()

或者,如果你真正拥有/想要的是一个元组元组,我认为你必须手动完成:

tuple(map(tuple, sub_c))