如何从对角矢量构造稀疏矩阵,如下所示: 假设我的矩阵是正方形,维度N = 6,我有以下向量
vec = np.array([[1], [1,2]])
我希望将这些部分放在对角线上
offset = np.array([2,3])
但是vec [0]应该从Mat [0,2]开始,而vec [1]应该从Mat [1,4]开始
我知道scipy.sparse.diags()但我不认为有一种方法可以指定非零元素存在的对角线的一部分。
这只是举例说明问题。实际上我处理的是非常大的数组,我不想浪费内存用于无用的零。
答案 0 :(得分:0)
这是你想要的矩阵吗?
In [200]: sparse.dia_matrix(([[0,0,1,0,0,0],[0,0,0,0,1,2]],[2,3]),(6,6)).A
Out[200]:
array([[0, 0, 1, 0, 0, 0],
[0, 0, 0, 0, 1, 0],
[0, 0, 0, 0, 0, 2],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0]])
是的,规范包括零,在较大的情况下可能会很烦人。
spdiags
只包装dia_matrix
,可以选择将结果转换为其他格式。在您的示例中,将7元素稀疏转换为3。
sparse.diags
接受一个参差不齐的值列表,但它们仍然需要匹配对角线的长度。在内部,它将它们转换为dia_matrix
所需的矩形数组。
S3=sparse.diags([[1,0,0,0],[0,1,2]],[2,3],(6,6))
因此,如果您真的需要对零进行简约操作,则需要使用coo
路线。
例如:
In [363]: starts = [[0,2],[1,4]]
In [364]: data = np.concatenate(vec)
In [365]: rows=np.concatenate([range(s[0],s[0]+len(v)) for s,v in zip(starts, vec)])
In [366]: cols=np.concatenate([range(s[1],s[1]+len(v)) for s,v in zip(starts, vec)])
In [367]: sparse.coo_matrix((data,(rows,cols)),(6,6)).A
Out[367]:
array([[0, 0, 1, 0, 0, 0],
[0, 0, 0, 0, 1, 0],
[0, 0, 0, 0, 0, 2],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0]])