summaryrefslogtreecommitdiff
path: root/networkx/relabel.py
diff options
context:
space:
mode:
authorJarrod Millman <jarrod.millman@gmail.com>2017-06-28 06:09:32 -0700
committerDan Schult <dschult@colgate.edu>2017-06-28 09:09:32 -0400
commit7ae3d0fddb6675f6b8b6847324c9d32e246dbbe5 (patch)
treeabf7b7499cb7cab2f900b61eb85ecc68b75832d9 /networkx/relabel.py
parent55876b7282042fe062cec8861a8c9e93270f3848 (diff)
downloadnetworkx-7ae3d0fddb6675f6b8b6847324c9d32e246dbbe5.tar.gz
Ensure _relabel_copy() respects node order of OrderedGraphs (#2488)
* Ensure _relabel_copy() respects node order of OrderedGraphs, fixes #2482 * Comply with pep8
Diffstat (limited to 'networkx/relabel.py')
-rw-r--r--networkx/relabel.py58
1 files changed, 30 insertions, 28 deletions
diff --git a/networkx/relabel.py b/networkx/relabel.py
index 569ba2c0..9cac3f16 100644
--- a/networkx/relabel.py
+++ b/networkx/relabel.py
@@ -6,10 +6,11 @@
# BSD license.
import networkx as nx
__author__ = """\n""".join(['Aric Hagberg <aric.hagberg@gmail.com>',
- 'Pieter Swart (swart@lanl.gov)',
- 'Dan Schult (dschult@colgate.edu)'])
+ 'Pieter Swart (swart@lanl.gov)',
+ 'Dan Schult (dschult@colgate.edu)'])
__all__ = ['convert_node_labels_to_integers', 'relabel_nodes']
+
def relabel_nodes(G, mapping, copy=True):
"""Relabel the nodes of the graph G.
@@ -76,21 +77,21 @@ def relabel_nodes(G, mapping, copy=True):
Only the nodes specified in the mapping will be relabeled.
The keyword setting copy=False modifies the graph in place.
- Relabel_nodes avoids naming collisions by building a
+ Relabel_nodes avoids naming collisions by building a
directed graph from ``mapping`` which specifies the order of
relabelings. Naming collisions, such as a->b, b->c, are ordered
such that "b" gets renamed to "c" before "a" gets renamed "b".
- In cases of circular mappings (e.g. a->b, b->a), modifying the
+ In cases of circular mappings (e.g. a->b, b->a), modifying the
graph is not possible in-place and an exception is raised.
In that case, use copy=True.
-
+
See Also
--------
convert_node_labels_to_integers
"""
# you can pass a function f(old_label)->new_label
# but we'll just make a dictionary here regardless
- if not hasattr(mapping,"__getitem__"):
+ if not hasattr(mapping, "__getitem__"):
m = dict((n, mapping(n)) for n in G)
else:
m = mapping
@@ -131,38 +132,39 @@ def _relabel_inplace(G, mapping):
try:
G.add_node(new, **G.node[old])
except KeyError:
- raise KeyError("Node %s is not in the graph"%old)
+ raise KeyError("Node %s is not in the graph" % old)
if multigraph:
new_edges = [(new, new if old == target else target, key, data)
- for (_,target,key,data)
+ for (_, target, key, data)
in G.edges(old, data=True, keys=True)]
if directed:
new_edges += [(new if old == source else source, new, key, data)
- for (source, _, key,data)
+ for (source, _, key, data)
in G.in_edges(old, data=True, keys=True)]
else:
new_edges = [(new, new if old == target else target, data)
- for (_,target,data) in G.edges(old, data=True)]
+ for (_, target, data) in G.edges(old, data=True)]
if directed:
- new_edges += [(new if old == source else source,new,data)
- for (source,_,data) in G.in_edges(old, data=True)]
+ new_edges += [(new if old == source else source, new, data)
+ for (source, _, data) in G.in_edges(old, data=True)]
G.remove_node(old)
G.add_edges_from(new_edges)
return G
+
def _relabel_copy(G, mapping):
H = G.__class__()
+ H.add_nodes_from(mapping.get(n, n) for n in G)
+ H._node.update(dict((mapping.get(n, n), d.copy()) for n, d in G.node.items()))
if G.name:
H.name = "(%s)" % G.name
if G.is_multigraph():
- H.add_edges_from( (mapping.get(n1, n1),mapping.get(n2, n2),k,d.copy())
- for (n1,n2,k,d) in G.edges(keys=True, data=True))
+ H.add_edges_from((mapping.get(n1, n1), mapping.get(n2, n2), k, d.copy())
+ for (n1, n2, k, d) in G.edges(keys=True, data=True))
else:
- H.add_edges_from( (mapping.get(n1, n1),mapping.get(n2, n2),d.copy())
- for (n1, n2, d) in G.edges(data=True))
+ H.add_edges_from((mapping.get(n1, n1), mapping.get(n2, n2), d.copy())
+ for (n1, n2, d) in G.edges(data=True))
- H.add_nodes_from(mapping.get(n, n) for n in G)
- H._node.update(dict((mapping.get(n, n), d.copy()) for n,d in G.node.items()))
H.graph.update(G.graph.copy())
return H
@@ -200,27 +202,27 @@ def convert_node_labels_to_integers(G, first_label=0, ordering="default",
--------
relabel_nodes
"""
- N = G.number_of_nodes()+first_label
+ N = G.number_of_nodes() + first_label
if ordering == "default":
mapping = dict(zip(G.nodes(), range(first_label, N)))
elif ordering == "sorted":
nlist = sorted(G.nodes())
mapping = dict(zip(nlist, range(first_label, N)))
elif ordering == "increasing degree":
- dv_pairs = [(d,n) for (n,d) in G.degree()]
- dv_pairs.sort() # in-place sort from lowest to highest degree
- mapping = dict(zip([n for d,n in dv_pairs], range(first_label, N)))
+ dv_pairs = [(d, n) for (n, d) in G.degree()]
+ dv_pairs.sort() # in-place sort from lowest to highest degree
+ mapping = dict(zip([n for d, n in dv_pairs], range(first_label, N)))
elif ordering == "decreasing degree":
- dv_pairs = [(d,n) for (n,d) in G.degree()]
- dv_pairs.sort() # in-place sort from lowest to highest degree
+ dv_pairs = [(d, n) for (n, d) in G.degree()]
+ dv_pairs.sort() # in-place sort from lowest to highest degree
dv_pairs.reverse()
- mapping = dict(zip([n for d,n in dv_pairs], range(first_label, N)))
+ mapping = dict(zip([n for d, n in dv_pairs], range(first_label, N)))
else:
- raise nx.NetworkXError('Unknown node ordering: %s'%ordering)
+ raise nx.NetworkXError('Unknown node ordering: %s' % ordering)
H = relabel_nodes(G, mapping)
- H.name = "("+G.name+")_with_int_labels"
+ H.name = "(" + G.name + ")_with_int_labels"
# create node attribute with the old label
if label_attribute is not None:
nx.set_node_attributes(H, label_attribute,
- dict((v,k) for k,v in mapping.items()))
+ dict((v, k) for k, v in mapping.items()))
return H