如何获取csr矩阵的跟踪

Dan*_*gre 3 python numpy matrix networkx

我在python和命令中使用networkx

A = nx.adjacency_matrix(G) 
Run Code Online (Sandbox Code Playgroud)

返回csr矩阵,而不是2D数组.因此,当我尝试做的时候

np.trace(A)
Run Code Online (Sandbox Code Playgroud)

我收到一个错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3/dist-packages/numpy/core/fromnumeric.py", line 1279, in trace
    return asarray(a).trace(offset, axis1, axis2, dtype, out)
ValueError: diag requires an array of at least two dimensions
Run Code Online (Sandbox Code Playgroud)

我该如何绕过去追踪?

hpa*_*ulj 9

In [543]: A=np.arange(9).reshape(3,3)
Run Code Online (Sandbox Code Playgroud)

对于数组,trace可以称为函数或方法.事实上,np.trace将行动委托给A.trace.

In [544]: np.trace(A)
Out[544]: 12

In [545]: A.trace()
Out[545]: 12

In [546]: M=sparse.csr_matrix(A)
Run Code Online (Sandbox Code Playgroud)

通常,在稀疏矩阵上调用numpy函数不起作用 - 除非矩阵具有匹配方法.

In [547]: np.trace(M)
...
ValueError: diag requires an array of at least two dimensions

In [548]: M.trace()
...
AttributeError: trace not found
Run Code Online (Sandbox Code Playgroud)

但稀疏矩阵有一个diagonal方法,这同样好:

In [549]: M.diagonal()
Out[549]: array([0, 4, 8], dtype=int32)

In [550]: M.diagonal().sum()
Out[550]: 12
Run Code Online (Sandbox Code Playgroud)

当然,您可以先将稀疏矩阵转换为数组:

In [551]: np.trace(M.A)
Out[551]: 12
Run Code Online (Sandbox Code Playgroud)