我有一个稀疏矩阵的行信息的Python列表。每一行都表示为(列,值)元组的列表。将其命名为alist
:
alist = [[(1,10), (3,-3)],
[(2,12)]]
我如何从这个列表中有效地构造一个scipy稀疏矩阵,得到一个像这样的矩阵:
0 10 0 -3
0 0 12 0
最明显的方法是创建一个scipy.sparse.lil_matrix
,它在内部具有这种“列表的列表”结构。但是从scipy.sparse.lil_matrix - SciPy v0.19.0参考指南中,我只看到了三种构建它们的方法:
- 从密集阵列开始
- 从另一个稀疏数组开始
- 构造一个空数组
因此,获取新数据的唯一方法是使用其他稀疏矩阵表示来解决这个问题,或者从密集数组开始,这两种方法都不能解决最初的问题,而且对于这个数据,这两种方法似乎都比lil_matrix
本身效率更低。
我想我可以做一个空的,并使用一个循环来添加值,但肯定我错过了一些东西。
当涉及到稀疏矩阵时,scipy文档真的很令人沮丧。
5条答案
按热度按时间xv8emn3q1#
如果在创建稀疏矩阵之前已经有了整个
alist
,那么就不需要使用lil_matrix
,因为它已经针对增量更新稀疏矩阵进行了优化。如果你想用矩阵做任何算术运算,
csr_matrix
可能是你最好的选择。您可以使用(data, (row, column))
直接构造csr_matrix
,如下所示:如果效率是一个真实的的问题,您可以直接创建
csr_matrix
内部格式(使用indptr):如果你要转换到pandas afterwords,
coo_matrix
是最好的选择,因为pandas无论如何都会转换为coo_matrix
:ru9i0ody2#
您的数据布局是一个不寻常的。这是我第一次尝试使用它。
是的,它是迭代的;
lil
是最好的格式。或者使用常见的
coo
输入样式:另一种选择是创建空白的
lil
矩阵,并直接填写其属性:换句话说,开始:
并将其更改为:
它仍然需要在
alist
结构上进行2级迭代。在另一条评论中,您提到了理解
csr
indptr
的困难。最简单的方法是转换这些格式之一:ncecgwcz3#
您可以从(列,值)元组
alist
的列表中创建位置和值的dict
,然后使用dok_matrix
构造稀疏矩阵cgvd09ve4#
只是想发布另一个使用
coo_matrix
的答案,这是一种快速构造稀疏矩阵的格式。rslzwgfq5#
发布的解决方案可以总结为三个步骤:添加行号、分解行数据、提取坐标和数据。下面是一个更详细的迭代器实现: