【发布时间】:2016-11-01 09:25:33
【问题描述】:
我有一个生成器可以生成相同长度的单一维度numpy.arrays。我想要一个包含该数据的稀疏矩阵。行的生成顺序与我希望将它们放在最终矩阵中的顺序相同。 csr 矩阵优于 lil 矩阵,但我认为后者在我所描述的场景中更容易构建。
假设 row_gen 是生成 numpy.array 行的生成器,则以下代码按预期工作。
def row_gen():
yield numpy.array([1, 2, 3])
yield numpy.array([1, 0, 1])
yield numpy.array([1, 0, 0])
matrix = scipy.sparse.lil_matrix(list(row_gen()))
因为该列表基本上会破坏生成器的所有优势,所以我希望以下内容具有相同的最终结果。更具体地说,我无法在内存中保存整个密集矩阵(或所有矩阵行的列表):
def row_gen():
yield numpy.array([1, 2, 3])
yield numpy.array([1, 0, 1])
yield numpy.array([1, 0, 0])
matrix = scipy.sparse.lil_matrix(row_gen())
但是它在运行时会引发以下异常:
TypeError: no supported conversion for types: (dtype('O'),)
我还注意到跟踪包括以下内容:
File "/usr/local/lib/python2.7/site-packages/scipy/sparse/lil.py", line 122, in __init__
A = csr_matrix(A, dtype=dtype).tolil()
这让我觉得使用scipy.sparse.lil_matrix 最终会创建一个csr 矩阵,然后才将其转换为lil 矩阵。在这种情况下,我宁愿先创建csr 矩阵。
回顾一下,我的问题是:从 python 生成器或 numpy 一维数组创建scipy.sparse 矩阵的最有效方法是什么?
【问题讨论】:
标签: python numpy scipy generator sparse-matrix