【问题标题】:How should I go about subsampling from a scipy.sparse.csr.csr_matrix and a list我应该如何从 scipy.sparse.csr.csr_matrix 和列表中进行子采样
【发布时间】:2014-05-18 22:39:41
【问题描述】:

我有一个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 矩阵的方法。

【问题讨论】:

    标签: python numpy scikit-learn


    【解决方案1】:

    您可以使用索引列表简单地索引 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 的 choice 生成无重复(无替换)的 N 随机索引:

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

    【讨论】:

    • 为了更明确地表明您正在对行进行切片,我想您可以改用 m[0,:]m[[0,2],:]
    • 是的,@justhalf 说的是正确的,m[rows] 相当于 m[rows,:] 并且都保留所有列。
    猜你喜欢
    • 1970-01-01
    • 2014-02-24
    • 1970-01-01
    • 2015-01-31
    • 2011-05-25
    • 2020-08-30
    • 2020-05-19
    • 2021-10-01
    • 1970-01-01
    相关资源
    最近更新 更多