交换行csr_matrix scipy

时间:2015-02-05 01:29:47

标签: numpy scipy

我在scipy中有一个256x256 csr_matrix,我有一个我想要应用的新行顺序列表。我试过这个:

def HblockDiag(z):
        Hz = H(z) # H(z) returns a 256x256 csr_matrix
        Hz.indices = idenRows
        return Hz

但它没有工作,因为indices没有给出每行的索引......最好的方法是什么?


编辑:

def HblockDiag(H, idenRows):
    x = H.tocoo()
    idenRows = np.asarray(idenRows, dtype=x.row.dtype)
    x.row = idenRows[x.row]
    H = x.tocsr()
    return H

test = sps.csr_matrix([[1,2,4],[6,3,4],[8,5,2]])
print test.toarray()
test = HblockDiag(test, [2,0,1])
print test.toarray()

我明白了:

[[1 2 4]
 [6 3 4]
 [8 5 2]]
[[6 3 4]
 [8 5 2]
 [1 2 4]]

相反,我想得到:

[[8 5 2]
 [1 2 4]
 [6 3 4]]

1 个答案:

答案 0 :(得分:2)

  • 从CSR转换为COO格式。

    x = Hz.tocoo()
    

    根据文档字符串sparse.coo_matrix.__doc__,首席运营官“非常快速地转换为CSR / CSC格式”。

  • 置换COO矩阵的行

    idenRows = np.argsort(idenRows)
    x.row = idenRows[x.row]
    
  • 从COO转换回CSR

    Hz = x.tocsr()
    

例如,

import numpy as np
import scipy.sparse as sps

def HblockDiag(H, idenRows):
    x = H.tocoo()
    idenRows = np.argsort(idenRows)
    idenRows = np.asarray(idenRows, dtype=x.row.dtype)
    x.row = idenRows[x.row]
    H = x.tocsr()
    return H

test = sps.csr_matrix([[1,2,4],[6,3,4],[8,5,2]])
print test.toarray()
# [[1 2 4]
#  [6 3 4]
#  [8 5 2]]

test = HblockDiag(test, [2,0,1])
print test.toarray()

产量

[[8 5 2]
 [1 2 4]
 [6 3 4]]

PS。通常,仅当矩阵的大小非常大时才使用稀疏矩阵。如果形状仅为(256,256),则不清楚为什么要使用稀疏矩阵。此外,矩阵应包含at least 80% zeros for sparse matrices to pay off