0

The moment I add 'weight' to a node, I can no longer generate adjacency_matrix() ? Any ideas of how to still be able to generate it ?

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'

the same goes for :

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

1 Answer 1

3

You are close - assign the node weight to g2.nodes[2]['weight'] and it will work.

Note though that the node weights do not appear in the adjacency matrix. It is the edge weights that are assigned there. For example

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.nodes[2]['weight']=7

In [5]: g2.nodes
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.edges[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]])

Also you will see I am using a newer version of networkx that generates sparse matrices so I have added the .todense() method to get a dense (numpy) matrix. In older versions use "node" and "edge".

Sign up to request clarification or add additional context in comments.

1 Comment

I have a very similar problem, although it involves generating the incidence matrix. I've posted my question here: stackoverflow.com/questions/40130515/…

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.