我有一个稀疏矩阵的行信息的Python列表 . 每行表示为(列,值)元组的列表 . 叫它 alist
:
alist = [[(1,10), (3,-3)],
[(2,12)]]
如何从列表列表中有效地构造一个scipy稀疏矩阵,得到如下矩阵:
0 10 0 -3
0 0 12 0
显而易见的方法是创建一个 scipy.sparse.lil_matrix
,它内部具有这个"list of lists"结构 . 但是从scipy.sparse.lil_matrix — SciPy v0.19.0 Reference Guide开始,我只看到了构建它们的三种方法:
-
从密集阵列开始
-
从另一个稀疏数组开始
-
只是构造一个空数组
因此,获取新数据的唯一方法是使用其他稀疏矩阵表示来解决此问题,或者从密集数组开始,这两者都没有解决初始问题,并且这两者似乎都是效率低于表示的 lil_matrix
本身就是这个数据 .
我想我可以制作一个空的,并使用循环来添加值,但我肯定错过了一些东西 .
在稀疏矩阵方面,scipy文档非常令人沮丧 .
4 回答
您可以从(列,值)元组
alist
列表中创建dict
位置和值,然后使用dok_matrix
构造稀疏矩阵只是想用
coo_matrix
发布另一个答案,它是一种构造稀疏矩阵的快速格式 .您的数据布局是不寻常的 . 这是我第一次尝试使用它 .
是的,它是迭代的;和
lil
是用于此目的的最佳格式 .或使用常见的
coo
输入样式:另一种选择是创建空白
lil
矩阵,并直接填写其属性:换句话说,从:
并将其更改为:
它仍然需要在
alist
结构上进行2级迭代 .在另一条评论中,你提到了理解
csr
indptr
的难度 . 最简单的方法是转换这些格式:如果在创建稀疏矩阵之前有整个
alist
,则无需使用lil_matrix
,因为它已针对递增更新稀疏矩阵进行了优化 .如果你想用矩阵后跟词进行任何算术运算,
csr_matrix
可能是你的最佳选择 . 您可以使用(data, (row, column))
格式直接构造csr_matrix
,如下所示:如果效率是一个真正的问题,您可以直接创建
csr_matrix
内部格式(使用indptr):如果您要转换为pandas afterwords,那么
coo_matrix
是可行的方法,因为pandas无论如何都会转换为coo_matrix
: