- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个生成器,可以生成相同长度的单维 numpy.array 。我想要一个包含该数据的稀疏矩阵。行的生成顺序与我希望它们出现在最终矩阵中的顺序相同。 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
矩阵的最有效方法是什么?
最佳答案
让我们看一下sparse.lil_matrix
的代码。它检查第一个参数:
if isspmatrix(arg1): # is is already a sparse matrix
...
elif isinstance(arg1,tuple): # is it the shape tuple
if isshape(arg1):
if shape is not None:
raise ValueError('invalid use of shape parameter')
M, N = arg1
self.shape = (M,N)
self.rows = np.empty((M,), dtype=object)
self.data = np.empty((M,), dtype=object)
for i in range(M):
self.rows[i] = []
self.data[i] = []
else:
raise TypeError('unrecognized lil_matrix constructor usage')
else:
# assume A is dense
try:
A = np.asmatrix(arg1)
except TypeError:
raise TypeError('unsupported matrix type')
else:
from .csr import csr_matrix
A = csr_matrix(A, dtype=dtype).tolil()
self.shape = A.shape
self.dtype = A.dtype
self.rows = A.rows
self.data = A.data
根据文档 - 您可以从另一个稀疏矩阵、形状和密集数组构造它。密集数组构造函数首先创建一个 csr
矩阵,然后将其转换为 lil
。
形状版本构造一个空的lil
,其数据如下:
In [161]: M=sparse.lil_matrix((3,5),dtype=int)
In [163]: M.data
Out[163]: array([[], [], []], dtype=object)
In [164]: M.rows
Out[164]: array([[], [], []], dtype=object)
很明显,传递生成器是行不通的 - 它不是一个密集数组。
但是创建了 lil
矩阵后,您可以使用常规数组赋值来填充元素:
In [167]: M[0,:]=[1,0,2,0,0]
In [168]: M[1,:]=[0,0,2,0,0]
In [169]: M[2,3:]=[1,1]
In [170]: M.data
Out[170]: array([[1, 2], [2], [1, 1]], dtype=object)
In [171]: M.rows
Out[171]: array([[0, 2], [2], [3, 4]], dtype=object)
In [172]: M.A
Out[172]:
array([[1, 0, 2, 0, 0],
[0, 0, 2, 0, 0],
[0, 0, 0, 1, 1]])
并且您可以直接为子列表赋值(我认为这更快,但更危险):
In [173]: M.data[1]=[1,2,3]
In [174]: M.rows[1]=[0,2,4]
In [176]: M.A
Out[176]:
array([[1, 0, 2, 0, 0],
[1, 0, 2, 0, 3],
[0, 0, 0, 1, 1]])
另一种增量方法是构造 3 个 coo
格式的数组或列表,然后根据它们创建 coo
或 csr
。
sparse.bmat
是另一个选项,其代码是构建 coo
输入的一个很好的示例。我会让你自己看看。
关于python - 使用 python 生成器高效创建 scipy.lil_matrix,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40352616/
这是我要做的事情的一个例子: my_rows = [[1, 3], [0, 2], [], [1]] my_data = [[1,1], [1,1], [],[1]] 我想创建一个像这样的矩阵: im
如何快速提取 scipy.sparse.lil_matrix 的两行并对它们应用按位运算?我试过: np.bitwise_and(A[1,:], A[2,:]) 但根据文档,NumPy 似乎需要数组类
我使用稀疏 lil_matrix 格式存储具有两种类型关系的图形。这就是我正在做的: e=15 k= 2 X = [lil_matrix((e,e)) for i in range(k)] #stor
我想将我的稀疏 scipy.lil_matrix 矩阵除以向量并再次获得稀疏矩阵。假设我有 2 个 lil_matrix 变量和 2 个 numpy 数组 a, b, c, d,像这样 In [1]:
我想逐步构建一个非常大的稀疏矩阵。问题是 lil_matrix 占用了太多 RAM,以至于效率低下。例如,如果我想创建一个 2000 万 x 2000 万的 lil_matrix,它会完全耗尽我的 R
我想从 scipy 稀疏矩阵中提取特定的行和列 - 可能 lil_matrix 将是这里的最佳选择。 它在这里工作正常: from scipy import sparse lilm=sparse.li
我有一个生成器,可以生成相同长度的单维 numpy.array 。我想要一个包含该数据的稀疏矩阵。行的生成顺序与我希望它们出现在最终矩阵中的顺序相同。 csr 矩阵优于 lil 矩阵,但我认为后者在我
在 Scipy 稀疏 lil_matrix 中找到最大值及其对应的行和列索引的最佳方法是什么?目的 ?我可以loop through the nonzero entries using itertoo
我有维数约为 200.000 的稀疏向量。我还有一个矩阵,其列数和行数与向量数相同。我想以增量方式将所有这些设置为矩阵,也就是说,第一个向量应该设置为第一行,依此类推。 目前,矩阵和向量的类型是 sc
我想迭代构建稀疏矩阵,并注意到根据 SciPy 文档有两个合适的选项: LiL matrix : class scipy.sparse.lil_matrix(arg1, shape=None, dty
我是一名优秀的程序员,十分优秀!