Python 从对角线部分创建稀疏阵列

Python 从对角线部分创建稀疏阵列,python,scipy,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(),但我认为没有办法只指定存在非零元素的对角线的一部分 这只是一个例子来说明这个问题。实际上,我处理的是非常大的数组,我不想为无用的零浪费内

如何从对角向量构造稀疏矩阵,如下所示: 假设我的矩阵是平方的,维数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(),但我认为没有办法只指定存在非零元素的对角线的一部分


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

这就是你想要的矩阵吗

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
仅包装
直径矩阵
,并可选择将结果转换为其他格式。在您的示例中,将7元素稀疏转换为3元素

sparse.diags
接受参差不齐的值列表,但它们仍然需要在长度上与对角线匹配。在内部,它将它们转换为
直径矩阵
所采用的矩形数组

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