通过对角线

时间:2017-07-26 23:41:30

标签: python-3.x numpy scipy sparse-matrix

我有一个scypy.sparse.csc_matrix,其中dtype = np.int32。我想通过该列中的对角线元素有效地划分矩阵的每一列(或行,csc_matrix中的哪一个更快)。所以mnew [:,i] = m [:,i] / m [i,i]。请注意,我需要将我的矩阵转换为np.double(因为mnew元素将在[0,1]中)并且由于矩阵非常庞大且非常稀疏我想知道我是否可以在某些有效/无for循环/从不这样做密集的方式。

最佳,

伊利亚安德

1 个答案:

答案 0 :(得分:2)

制作稀疏矩阵:

In [379]: M = sparse.random(5,5,.2, format='csr')
In [380]: M
Out[380]: 
<5x5 sparse matrix of type '<class 'numpy.float64'>'
    with 5 stored elements in Compressed Sparse Row format>
In [381]: M.diagonal()
Out[381]: array([ 0.,  0.,  0.,  0.,  0.])

对角线上有太多0 - 让我们添加一个非零对角线:

In [382]: D=sparse.dia_matrix((np.random.rand(5),0),shape=(5,5))
In [383]: D
Out[383]: 
<5x5 sparse matrix of type '<class 'numpy.float64'>'
    with 5 stored elements (1 diagonals) in DIAgonal format>
In [384]: M1 = M+D


In [385]: M1
Out[385]: 
<5x5 sparse matrix of type '<class 'numpy.float64'>'
    with 10 stored elements in Compressed Sparse Row format>

In [387]: M1.A
Out[387]: 
array([[ 0.35786668,  0.81754484,  0.        ,  0.        ,  0.        ],
       [ 0.        ,  0.41928992,  0.        ,  0.01371273,  0.        ],
       [ 0.        ,  0.        ,  0.4685924 ,  0.        ,  0.35724102],
       [ 0.        ,  0.        ,  0.77591294,  0.95008721,  0.16917791],
       [ 0.        ,  0.        ,  0.        ,  0.        ,  0.16659141]])

现在将每列按对角线划分是微不足道的(这是一个矩阵'产品')

In [388]: M1/M1.diagonal()
Out[388]: 
matrix([[ 1.        ,  1.94983185,  0.        ,  0.        ,  0.        ],
        [ 0.        ,  1.        ,  0.        ,  0.01443313,  0.        ],
        [ 0.        ,  0.        ,  1.        ,  0.        ,  2.1444144 ],
        [ 0.        ,  0.        ,  1.65583764,  1.        ,  1.01552603],
        [ 0.        ,  0.        ,  0.        ,  0.        ,  1.        ]])

或划分行 - (乘以列向量)

In [391]: M1/M1.diagonal()[:,None]
哎呀,这些都很密集;让我们做对角线稀疏

In [408]: md = sparse.csr_matrix(1/M1.diagonal())  # do the inverse here
In [409]: md
Out[409]: 
<1x5 sparse matrix of type '<class 'numpy.float64'>'
    with 5 stored elements in Compressed Sparse Row format>
In [410]: M.multiply(md)
Out[410]: 
<5x5 sparse matrix of type '<class 'numpy.float64'>'
    with 5 stored elements in Compressed Sparse Row format>
In [411]: M.multiply(md).A
Out[411]: 
array([[ 0.        ,  1.94983185,  0.        ,  0.        ,  0.        ],
       [ 0.        ,  0.        ,  0.        ,  0.01443313,  0.        ],
       [ 0.        ,  0.        ,  0.        ,  0.        ,  2.1444144 ],
       [ 0.        ,  0.        ,  1.65583764,  0.        ,  1.01552603],
       [ 0.        ,  0.        ,  0.        ,  0.        ,  0.        ]])

md.multiply(M)列版本。

Division of sparse matrix - 类似,但它使用行的总和而不是对角线。对潜在的“除零”问题进行更多处理。