从对角线部分创建稀疏数组

时间:2015-03-25 11:56:23

标签: python scipy

如何从对角矢量构造稀疏矩阵,如下所示: 假设我的矩阵是正方形,维度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()但我不认为有一种方法可以指定非零元素存在的对角线的一部分。

这只是举例说明问题。实际上我处理的是非常大的数组,我不想浪费内存用于无用的零。

1 个答案:

答案 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]])