【发布时间】:2015-11-10 15:41:20
【问题描述】:
在使用 scipy.sparse.spdiags 或 scipy.sparse.diags 时,我注意到希望我认为这是例程中的一个错误,例如
scipy.sparse.spdiags([1.1,1.2,1.3],1,4,4).toarray()
返回
array([[ 0. , 1.2, 0. , 0. ],
[ 0. , 0. , 1.3, 0. ],
[ 0. , 0. , 0. , 0. ],
[ 0. , 0. , 0. , 0. ]])
对于正对角线,它会丢弃前 k 个数据。有人可能会争辩说,这有一些宏大的编程原因,我只需要用零填充。好吧,这可能很烦人,可以使用 scipy.sparse.diags 给出正确的结果。然而,这个例程有一个无法解决的错误
scipy.sparse.diags([1.1,1.2],0,(4,2)).toarray()
给予
array([[ 1.1, 0. ],
[ 0. , 1.2],
[ 0. , 0. ],
[ 0. , 0. ]])
不错,而且
scipy.sparse.diags([1.1,1.2],-2,(4,2)).toarray()
给予
array([[ 0. , 0. ],
[ 0. , 0. ],
[ 1.1, 0. ],
[ 0. , 1.2]])
但是
scipy.sparse.diags([1.1,1.2],-1,(4,2)).toarray()
给出一个错误,提示 ValueError: Diagonal length (index 0: 2 at offset -1) does not agree with matrix size (4, 2)。显然答案是
array([[ 0. , 0. ],
[ 1.1, 0. ],
[ 0. , 1.2],
[ 0. , 0. ]])
对于额外的随机行为,我们有
scipy.sparse.diags([1.1],-1,(4,2)).toarray()
给予
array([[ 0. , 0. ],
[ 1.1, 0. ],
[ 0. , 1.1],
[ 0. , 0. ]])
有人知道是否有一个构造对角稀疏矩阵的函数确实有效吗?
【问题讨论】:
-
这似乎是
scipy.sparse.diags中的一个错误。查看source,我们可以看到对角线长度计算为m, n = shape ... length = min(m + offset, n - offset),这是不对的。这值得一个错误报告。 -
更多代码在我的回答中。我想知道
length = min(m + k, n - k)是否是正确的length。offset=-2案例有效可能只是巧合。 -
我记得有一个 SO 问题将
spdiags与 Matlab 等价物进行对比。
标签: python scipy sparse-matrix