簡體   English   中英

如何將具有復雜權重的 NetworkX 圖轉換為矩陣?

[英]How to convert a NetworkX graph with complex weights to a matrix?

我有一個權重是復數的圖表。 networkx有一些函數可以將圖形轉換為邊權重矩陣,但是,它似乎不適用於復數(盡管反向轉換可以正常工作)。 似乎需要intfloat邊緣權重才能將它們轉換為 NumPy 數組/矩陣。

Python 3.9.7 | packaged by conda-forge | (default, Sep 29 2021, 19:20:46) 
Type 'copyright', 'credits' or 'license' for more information
IPython 7.29.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: import numpy as np

In [2]: import networkx as nx

In [3]: X = np.random.normal(size=(5,5)) + 1j*np.random.normal(size=(5,5))

In [4]: X
Out[4]: 
array([[ 1.64351378-0.83369888j, -2.29785353-0.86089473j,
...
...   
         0.50504368-0.67854997j, -0.29049118-0.48822688j,
         0.22752377-1.38491981j]])

In [5]: g = nx.DiGraph(X)

In [6]: for i,j in g.edges(): print(f"{(i,j)}: {g[i][j]['weight']}")
(0, 0): (1.6435137789271903-0.833698877745345j)
...
(4, 4): (0.2275237661137745-1.3849198099771993j)

# So conversion from matrix to nx.DiGraph works just fine.
# But the other way around gives an error.

In [7]: Z = nx.to_numpy_array(g, dtype=np.complex128)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-7-b0b717e5ec8a> in <module>
----> 1 Z = nx.to_numpy_array(g, dtype=np.complex128)

~/miniconda3/envs/coupling/lib/python3.9/site-packages/networkx/convert_matrix.py in to_numpy_array(G, nodelist, dtype, order, multigraph_weight, weight, nonedge)
   1242             for v, d in nbrdict.items():
   1243                 try:
-> 1244                     A[index[u], index[v]] = d.get(weight, 1)
   1245                 except KeyError:
   1246                     # This occurs when there are fewer desired nodes than

TypeError: can't convert complex to float

我查看了文檔,似乎只能說這僅適用於簡單的 NumPy 數據類型,對於復合類型,應該使用recarrays。 我不太了解recarrays,使用np.to_numpy_recarray也會產生錯誤。

In [8]: Z = nx.to_numpy_recarray(g, dtype=np.complex128)
...
TypeError: 'NoneType' object is not iterable

所以問題是如何正確地將圖形轉換為邊權重矩陣?

以下是一個快速破解,在實施修復之前可能很有用:

import networkx as nx
import numpy as np


def to_numpy_complex(G):

    # create an empty array
    N_size = len(G.nodes())
    E = np.empty(shape=(N_size, N_size), dtype=np.complex128)

    for i, j, attr in G.edges(data=True):
        E[i, j] = attr.get("weight")

    return E


X = np.random.normal(size=(5, 5)) + 1j * np.random.normal(size=(5, 5))

g = nx.DiGraph(X)

Y = to_numpy_complex(g)

print(np.allclose(X, Y)) # True

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM