获取 scipy 稀疏矩阵中每一行的前 n 个项目

Posted

技术标签:

【中文标题】获取 scipy 稀疏矩阵中每一行的前 n 个项目【英文标题】:Get top-n items of every row in a scipy sparse matrix 【发布时间】:2016-03-21 15:59:38 【问题描述】:

阅读this 类似问题后,我仍然无法完全理解如何实施我正在寻找的解决方案。我有一个稀疏矩阵,即:

 import numpy as np
 from scipy import sparse
 arr = np.array([[0,5,3,0,2],[6,0,4,9,0],[0,0,0,6,8]])
 arr_csc = sparse.csc_matrix(arr)

我想有效地获得每行的前 n 项,而不将稀疏矩阵转换为密集矩阵。 最终结果应如下所示(假设 n=2):

 top_n_arr = np.array([[0,5,3,0,0],[6,0,0,9,0],[0,0,0,6,8]])
 top_n_arr_csc = sparse.csc_matrix(top_n_arr)

【问题讨论】:

【参考方案1】:

链接的答案有什么问题?它不适用于您的情况吗?或者你只是不明白?还是不够高效

我打算建议找出一种方法来查找 lil 格式矩阵的一行的最高值,然后逐行应用该行。但我只是重复我之前的回答。


好的,我之前的回答是一个开始,但缺少一些关于迭代 lol 格式的细节。这是一个开始;它可能会被清理掉。

制作数组和lil 版本:

In [42]: arr = np.array([[0,5,3,0,2],[6,0,4,9,0],[0,0,0,6,8]])    
In [43]: arr_sp=sparse.csc_matrix(arr)
In [44]: arr_ll=arr_sp.tolil()

上一个答案的行函数:

def max_n(row_data, row_indices, n):
        i = row_data.argsort()[-n:]
        # i = row_data.argpartition(-n)[-n:]
        top_values = row_data[i]
        top_indices = row_indices[i]  # do the sparse indices matter?
        return top_values, top_indices, i

遍历arr_ll的行,应用这个函数并替换元素:

In [46]: for i in range(arr_ll.shape[0]):
    d,r=max_n(np.array(arr_ll.data[i]),np.array(arr_ll.rows[i]),2)[:2]
    arr_ll.data[i]=d.tolist()
    arr_ll.rows[i]=r.tolist()
   ....:     

In [47]: arr_ll.data
Out[47]: array([[3, 5], [6, 9], [6, 8]], dtype=object)

In [48]: arr_ll.rows
Out[48]: array([[2, 1], [0, 3], [3, 4]], dtype=object)

In [49]: arr_ll.tocsc().A
Out[49]: 
array([[0, 5, 3, 0, 0],
       [6, 0, 0, 9, 0],
       [0, 0, 0, 6, 8]])

lil 格式中,数据存储在 2 个对象类型数组中,作为子列表,一个带有数据编号,另一个带有列索引。

在做新事情时查看稀疏矩阵的数据属性很方便。更改这些属性有一些风险,因为它会弄乱整个数组。但看起来lil 格式可以像这样安全地调整。

csr 格式比csc 更适合访问行。它的数据存储在 3 个数组中,dataindicesindptrlil 格式根据indptr 中的信息有效地将其中的两个数组拆分为子列表。 csr 非常适合数学(乘法、加法等),但在更改稀疏度(将非零值变为零)时不太好。

【讨论】:

可以请你展示你将如何使用 lil 来做这件事吗?我已阅读您的详细答案,但无法解决。

以上是关于获取 scipy 稀疏矩阵中每一行的前 n 个项目的主要内容,如果未能解决你的问题,请参考以下文章

用于 numpy 数组和 scipy 稀疏矩阵的 Tensordot

Scipy CSR 矩阵逐元素加法

python中scipy学习——随机稀疏矩阵及操作

Scipy稀疏矩阵维度问题

Scipy 稀疏矩阵作为 DataFrame 列

用于文档分类的 scipy/sklearn 稀疏矩阵分解