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

时间:2013-08-07 18:49:41

标签: python numpy scipy sparse-matrix

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

例如:

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

如何在不转换为numpy数组的情况下取回一个向量?

1 个答案:

答案 0 :(得分:2)

当稀疏数组采用dia格式时,对角线上的数据会记录在offsetsdata属性中:

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

因此对于数组

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

上面的代码产生

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

上面的输出是打印偏移量,然后是该偏移量处的对角线。

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