Python 从scipy稀疏矩阵中提取非主对角线?

Python 从scipy稀疏矩阵中提取非主对角线?,python,numpy,scipy,sparse-matrix,Python,Numpy,Scipy,Sparse Matrix,假设我有一个scipy.sparse格式的稀疏矩阵。如何提取主对角线以外的对角线?对于numpy数组,可以使用numpy.diag。是否有一个scipy稀疏等价物 例如: from scipy import sparse A = sparse.diags(ones(5),1) 如何在不转换为numpy数组的情况下返回1的向量?当稀疏数组采用dia格式时,沿对角线的数据记录在偏移量和数据属性中: import scipy.sparse as sparse import numpy as np

假设我有一个scipy.sparse格式的稀疏矩阵。如何提取主对角线以外的对角线?对于numpy数组,可以使用numpy.diag。是否有一个scipy稀疏等价物

例如:

from scipy import sparse
A = sparse.diags(ones(5),1)

如何在不转换为numpy数组的情况下返回1的向量?

当稀疏数组采用
dia
格式时,沿对角线的数据记录在
偏移量
数据
属性中:

import scipy.sparse as sparse
import numpy as np

def make_sparse_array():
    A = np.arange(ncol*nrow).reshape(nrow, ncol)
    row, col = zip(*np.ndindex(nrow, ncol))
    val = A.ravel()

    A = sparse.coo_matrix(
        (val, (row, col)), shape=(nrow, ncol), dtype='float')
    A = A.todia()
    # A = sparse.diags(np.ones(5), 1)
    # A = sparse.diags([np.ones(4),np.ones(3)*2,], [2,3])
    print(A.toarray())
    return A

nrow, ncol = 10, 5
A = make_sparse_array()
diags = {offset:(diag[offset:nrow+offset] if 0<=offset<=ncol else
                 diag if offset+nrow-ncol>=0 else
                 diag[:offset+nrow-ncol])
         for offset, diag in zip(A.offsets, A.data)}


for offset, diag in sorted(diags.iteritems()):
    print('{o}: {d}'.format(o=offset, d=diag))
上面的代码生成

-9: [ 45.]
-8: [ 40.  46.]
-7: [ 35.  41.  47.]
-6: [ 30.  36.  42.  48.]
-5: [ 25.  31.  37.  43.  49.]
-4: [ 20.  26.  32.  38.  44.]
-3: [ 15.  21.  27.  33.  39.]
-2: [ 10.  16.  22.  28.  34.]
-1: [  5.  11.  17.  23.  29.]
0: [  0.   6.  12.  18.  24.]
1: [  1.   7.  13.  19.]
2: [  2.   8.  14.]
3: [ 3.  9.]
4: [ 4.]
上面的输出是打印偏移量,然后是该偏移量处的对角线

上面的代码应该适用于任何稀疏数组。我使用完全填充的稀疏数组只是为了更容易检查输出是否正确

-9: [ 45.]
-8: [ 40.  46.]
-7: [ 35.  41.  47.]
-6: [ 30.  36.  42.  48.]
-5: [ 25.  31.  37.  43.  49.]
-4: [ 20.  26.  32.  38.  44.]
-3: [ 15.  21.  27.  33.  39.]
-2: [ 10.  16.  22.  28.  34.]
-1: [  5.  11.  17.  23.  29.]
0: [  0.   6.  12.  18.  24.]
1: [  1.   7.  13.  19.]
2: [  2.   8.  14.]
3: [ 3.  9.]
4: [ 4.]