AttributeError: 'str' object has no attribute 'copy'

时间:2022-03-30 08:52:36

在使用Python Networkx 中的relabel_nodes函数时,出现:

AttributeError: 'str' object has no attribute 'copy'

找了半天也没发现错误出现在哪里,通过比较发现:

如果在定义图的类型时候使用G=nx.MultiDiGraph()就会出现这个错误,改为G=nx.Graph()错误消失。

目测是relabel_nodes函数不支持MultiDiGraph。

附:

 1 def relabel_nodes(G, mapping, copy=True):
 2     """Relabel the nodes of the graph G.
 3 
 4     Parameters
 5     ----------
 6     G : graph
 7        A NetworkX graph
 8 
 9     mapping : dictionary
10        A dictionary with the old labels as keys and new labels as values.
11        A partial mapping is allowed.
12 
13     copy : bool (optional, default=True)
14        If True return a copy, or if False relabel the nodes in place.
15 
16     Examples
17     --------
18     >>> G=nx.path_graph(3)  # nodes 0-1-2
19     >>> mapping={0:'a',1:'b',2:'c'}
20     >>> H=nx.relabel_nodes(G,mapping)
21     >>> print(sorted(H.nodes()))
22     ['a', 'b', 'c']
23 
24     >>> G=nx.path_graph(26) # nodes 0..25
25     >>> mapping=dict(zip(G.nodes(),"abcdefghijklmnopqrstuvwxyz"))
26     >>> H=nx.relabel_nodes(G,mapping) # nodes a..z
27     >>> mapping=dict(zip(G.nodes(),range(1,27)))
28     >>> G1=nx.relabel_nodes(G,mapping) # nodes 1..26
29 
30     Partial in-place mapping:
31 
32     >>> G=nx.path_graph(3)  # nodes 0-1-2
33     >>> mapping={0:'a',1:'b'} # 0->'a' and 1->'b'
34     >>> G=nx.relabel_nodes(G,mapping, copy=False)
35 
36     print(G.nodes())
37     [2, 'b', 'a']
38 
39     Mapping as function:
40 
41     >>> G=nx.path_graph(3)
42     >>> def mapping(x):
43     ...    return x**2
44     >>> H=nx.relabel_nodes(G,mapping)
45     >>> print(H.nodes())
46     [0, 1, 4]
47 
48     Notes
49     -----
50     Only the nodes specified in the mapping will be relabeled.
51 
52     The keyword setting copy=False modifies the graph in place.
53     This is not always possible if the mapping is circular.
54     In that case use copy=True.
55 
56     See Also
57     --------
58     convert_node_labels_to_integers
59     """
60     # you can pass a function f(old_label)->new_label
61     # but we'll just make a dictionary here regardless
62     if not hasattr(mapping,"__getitem__"):
63         m = dict((n, mapping(n)) for n in G)
64     else:
65         m = mapping
66     if copy:
67         return _relabel_copy(G, m)
68     else:
69         return _relabel_inplace(G, m)