簡體   English   中英

將非數字元組轉換為numpy矩陣

[英]Convert non-numeric tuples to numpy matrix

我試圖通過一個很大的元組列表來表示一個鄰接矩陣。 我將如何以numpy矩陣或scipy.sparse矩陣表示此列表,以便使用像igraph或networkx這樣的包?

[('b', 'c'),
 ('b', 'a'),
 ('c', 'd'),
 ('c', 'a'),
 ('c', 'b'),
 ('a', 'b'),
 ('a', 'c')]

如果這是重復的,我深表歉意,但是我找不到任何有關如何將非數字元組轉換為鄰接矩陣的文檔。

您可以使用np.unique將節點轉換為索引:

>>> adj = [('b', 'c'),
...        ('b', 'a'),
...        ('c', 'd'),
...        ('c', 'a'),
...        ('c', 'b'),
...        ('a', 'b'),
...        ('a', 'c')]
>>> node_names, adj_idx = np.unique(adj, return_inverse=True)
>>> node_names
array(['a', 'b', 'c', 'd'], 
      dtype='|S1')
>>> adj_idx = adj_idx.reshape(-1, 2)
>>> adj_idx
array([[1, 2],
       [1, 0],
       [2, 3],
       [2, 0],
       [2, 1],
       [0, 1],
       [0, 2]])

由此,您可以將密集鄰接矩陣構造為:

>>> adj_matrix = np.zeros((len(node_names),)*2)
>>> adj_matrix[adj_idx[:, 0], adj_idx[:, 1]] = 1
>>> adj_matrix
array([[ 0.,  1.,  1.,  0.],
       [ 1.,  0.,  1.,  0.],
       [ 1.,  1.,  0.,  1.],
       [ 0.,  0.,  0.,  0.]])

或稀疏格式為:

>>> sps_adj_mat = sps.coo_matrix((np.ones(shape=(len(adj_idx),)),
...                               (adj_idx[:, 0], adj_idx[:, 1])),
...                              shape=(len(node_names),)*2)
>>> sps_adj_mat
<4x4 sparse matrix of type '<type 'numpy.float64'>'
    with 7 stored elements in COOrdinate format>
>>> sps_adj_mat.A
array([[ 0.,  1.,  1.,  0.],
       [ 1.,  0.,  1.,  0.],
       [ 1.,  1.,  0.,  1.],
       [ 0.,  0.,  0.,  0.]])

NetworkX可以具有非數字節點。 如果我正確理解了您的問題,則可以像下面這樣輕松地在networkx圖形中使用它:

import networkx as nx
g = nx.Graph([('a', 'b'), ('c', 'd'), ...])

您是否在問如何將其轉換為scipy.sparsenumpy矩陣? 還是您想將其與graph和networkx一起使用?

暫無
暫無

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

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