Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 规范化矩阵行scipy矩阵_Python 2.7_Scipy - Fatal编程技术网

Python 2.7 规范化矩阵行scipy矩阵

Python 2.7 规范化矩阵行scipy矩阵,python-2.7,scipy,Python 2.7,Scipy,我希望规范化从networkx有向图获得的稀疏scipy矩阵的每一行 import networkx as nx import numpy as np G=nx.random_geometric_graph(10,0.3) M=nx.to_scipy_sparse_matrix(G, nodelist=G.nodes()) from __future__ import division print(M[3]) (0, 1) 1 (0, 5) 1

我希望规范化从networkx有向图获得的稀疏scipy矩阵的每一行

 import networkx as nx
 import numpy as np

G=nx.random_geometric_graph(10,0.3)
M=nx.to_scipy_sparse_matrix(G, nodelist=G.nodes())

from __future__ import division

 print(M[3])
  (0, 1)        1
  (0, 5)        1

print(M[3].multiply(1/M[3].sum()))                                                                                                                                                                                                                                         
  (0, 1)        0.5
  (0, 5)        0.5
这是好的,我像往常一样正常化,它的工作所需。 但如果我写:

>>> M[3]=M[3].multiply(1/M[3].sum())
>>> M[3]
<1x10 sparse matrix of type '<type 'numpy.int64'>'
        with 10 stored elements in Compressed Sparse Row format>
  (0, 0)        0
  (0, 1)        0
  (0, 2)        0
  (0, 3)        0
  (0, 4)        0
  (0, 5)        0
  (0, 6)        0
  (0, 7)        0
  (0, 8)        0
  (0, 9)        0
>M[3]=M[3]。乘法(1/M[3]。求和()
>>>M[3]
(0, 0)        0
(0, 1)        0
(0, 2)        0
(0, 3)        0
(0, 4)        0
(0, 5)        0
(0, 6)        0
(0, 7)        0
(0, 8)        0
(0, 9)        0
我只需要对每一行进行迭代,并对稀疏的scipy矩阵进行规格化。 你会怎么做? 谢谢

这里有一个方法(来自networkx.pagerank\u scipy)。它使用scipy线性代数函数,而不是迭代每一行。对于大型图形,这可能会更快

In [42]: G=nx.random_geometric_graph(5,0.5)

In [43]: M=nx.to_scipy_sparse_matrix(G, nodelist=G.nodes(), dtype=float)

In [44]: M.todense()
Out[44]: 
matrix([[ 0.,  1.,  0.,  1.,  1.],
        [ 1.,  0.,  0.,  0.,  1.],
        [ 0.,  0.,  0.,  1.,  1.],
        [ 1.,  0.,  1.,  0.,  1.],
        [ 1.,  1.,  1.,  1.,  0.]])

In [45]: S = scipy.array(M.sum(axis=1)).flatten()

In [46]: S[S != 0] = 1.0 / S[S != 0]

In [47]: Q = scipy.sparse.spdiags(S.T, 0, *M.shape, format='csr')

In [48]: (Q*M).todense()
Out[48]: 
matrix([[ 0.        ,  0.33333333,  0.        ,  0.33333333,  0.33333333],
        [ 0.5       ,  0.        ,  0.        ,  0.        ,  0.5       ],
        [ 0.        ,  0.        ,  0.        ,  0.5       ,  0.5       ],
        [ 0.33333333,  0.        ,  0.33333333,  0.        ,  0.33333333],
        [ 0.25      ,  0.25      ,  0.25      ,  0.25      ,  0.        ]])
原因是什么

print(M[3].multiply(1/M[3].sum())) 
产生预期结果,以及

M[3]=M[3].multiply(1/M[3].sum())
产生零是因为
M
是一个整数数组,
。只要我们不尝试将规范分配回
M
,这就不是问题

如果
M.A

array([[0, 1, 0, 1, 1],
       [1, 0, 0, 0, 1],
       [0, 0, 0, 1, 1],
       [1, 0, 1, 0, 1],
       [1, 1, 1, 1, 0]], dtype=int32)
列的总和为:
Msum=M.sum(轴=1)
。它是稠密的

matrix([[3],
        [2],
        [2],
        [3],
        [4]], dtype=int32)
反之亦然:

Mnorm = 1/Msum
matrix([[ 0.33333333],
        [ 0.5       ],
        [ 0.5       ],
        [ 0.33333333],
        [ 0.25      ]])
M.multiply(Mnorm)
非常密集(就像设置
M.multiply
的方式一样)。但是要使范数稀疏,乘积也是稀疏的

M1 = M.multiply(sparse.csr_matrix(Mnorm))
<5x5 sparse matrix of type '<class 'numpy.float64'>'
    with 14 stored elements in Compressed Sparse Row format>
M1.A
array([[ 0.        ,  0.33333333,  0.        ,  0.33333333,  0.33333333],
       [ 0.5       ,  0.        ,  0.        ,  0.        ,  0.5       ],
       [ 0.        ,  0.        ,  0.        ,  0.5       ,  0.5       ],
       [ 0.33333333,  0.        ,  0.33333333,  0.        ,  0.33333333],
       [ 0.25      ,  0.25      ,  0.25      ,  0.25      ,  0.        ]])
A = M.A
A/np.sum(A, axis=1, keepdims=True)