2

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

例如:

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

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

4

1 回答 1

2

稀疏数组dia格式化时,沿对角线的数据记录在offsetsanddata属性中:

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

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

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

于 2013-08-07T20:08:08.830 回答