NetworkX: когда я добавляю «вес» к какому-либо узлу, я не могу сгенерировать adjacecy_matrix()?

В тот момент, когда я добавляю «вес» узлу, я больше не могу генерировать adjacency_matrix() ? Любые идеи о том, как все еще иметь возможность генерировать его?

In [73]: g2 = nx.Graph()

In [74]: g2.add_path([1,2,3,5,4,3,1,4,3,7,2])

In [75]: nx.adjacency_matrix(g2)
Out[75]: 
matrix([[ 0.,  1.,  1.,  1.,  0.,  0.],
    [ 1.,  0.,  1.,  0.,  0.,  1.],
    [ 1.,  1.,  0.,  1.,  1.,  1.],
    [ 1.,  0.,  1.,  0.,  1.,  0.],
    [ 0.,  0.,  1.,  1.,  0.,  0.],
    [ 0.,  1.,  1.,  0.,  0.,  0.]])

In [76]: g2[3]['weight'] = 5

In [77]: nx.adjacency_matrix(g2)
---------------------------------------------------------------------------
 AttributeError                            Traceback (most recent call last)
 <ipython-input-77-532c786b4588> in <module>()
 ----> 1 nx.adjacency_matrix(g2)

/usr/lib/pymodules/python2.7/networkx/linalg/graphmatrix.pyc in  adjacency_matrix(G, nodelist, weight)
     144     to_dict_of_dicts
     145     """
--> 146     return nx.to_numpy_matrix(G,nodelist=nodelist,weight=weight)
    147 
    148 adj_matrix=adjacency_matrix

/usr/lib/pymodules/python2.7/networkx/convert.pyc in to_numpy_matrix(G, nodelist, dtype, order, multigraph_weight, weight)
    522             for v,d in nbrdict.items():
    523                 try:
--> 524                     M[index[u],index[v]]=d.get(weight,1)
    525                 except KeyError:
    526                     pass

AttributeError: 'int' object has no attribute 'get'

то же самое касается:

 In [79]: nx.adjacency_matrix(g2,weight='weight')

person sten    schedule 25.07.2015    source источник


Ответы (1)


Вы близки - назначьте вес узла g2.node[2]['weight'] и он будет работать.

Однако обратите внимание, что веса узлов не отображаются в матрице смежности. Там присваиваются веса ребер. Например

In [1]: import networkx as nx

In [2]: g2 = nx.Graph()

In [3]: g2.add_path([1,2,3,5,4,3,1,4,3,7,2])

In [4]: g2.node[2]['weight']=7

In [5]: g2.node
Out[5]: {1: {}, 2: {'weight': 7}, 3: {}, 4: {}, 5: {}, 7: {}}

In [6]: nx.adjacency_matrix(g2).todense()
Out[6]: 
matrix([[0, 1, 1, 1, 0, 0],
        [1, 0, 1, 0, 0, 1],
        [1, 1, 0, 1, 1, 1],
        [1, 0, 1, 0, 1, 0],
        [0, 0, 1, 1, 0, 0],
        [0, 1, 1, 0, 0, 0]])

In [7]: g2.edge[1][2]['weight'] = 42

In [8]: nx.adjacency_matrix(g2).todense()
Out[8]: 
matrix([[ 0, 42,  1,  1,  0,  0],
        [42,  0,  1,  0,  0,  1],
        [ 1,  1,  0,  1,  1,  1],
        [ 1,  0,  1,  0,  1,  0],
        [ 0,  0,  1,  1,  0,  0],
        [ 0,  1,  1,  0,  0,  0]])

Также вы увидите, что я использую более новую версию networkx, которая генерирует разреженные матрицы, поэтому я добавил метод .todense() для получения плотной (пустой) матрицы.

person Aric    schedule 25.07.2015
comment
У меня очень похожая проблема, хотя она включает в себя создание матрицы инцидентности. Я разместил свой вопрос здесь: stackoverflow.com/questions/40130515/ - person FaCoffee; 19.10.2016