Понимание списка возвращает только последнюю итерацию - PullRequest
2 голосов
/ 30 мая 2019

Я пытаюсь создать совокупность матриц смежности с разными случайными весами, для которых я использую код ниже.Моя проблема, однако, заключается в том, что при выполнении этого все весовые коэффициенты соответствуют весам последней итерации понимания списка?При печати этих adjacencylists во время генерации он работает нормально, однако вывод функции getPopulation в 5 раз превышает тот же набор параметров.

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

Уже пробовали использовать обычные циклы for, операторы печати и т. Д.

import networkx as nx
import numpy as np

G = nx.DiGraph()
G.add_nodes_from(["Sadness", "Avoidance", "Guilt"])
G.add_edges_from([("Sadness", "Avoidance")], weight=1)
G.add_edges_from([("Avoidance", "Sadness")], weight=1)
G.add_edges_from([("Avoidance", "Guilt"), ("Guilt", "Sadness")], weight=1)
parameters = nx.to_numpy_matrix(G)

def getRandParamValue(adj):
    for p in np.transpose(adj.nonzero()):
        adj[p[0], p[1]] = adj[p[0], p[1]] * np.random.uniform()
    print(adj)
    return adj

def getPopulation(size, initParam):
    return [getRandParamValue(initParam) for i in range(size)]

getPopulation(5, parameters)

При печати вывода в функции getRandParamValue она работает нормально:

[[0.         0.40218464 0.        ]
 [0.07330473 0.         0.7196376 ]
 [0.53148413 0.         0.        ]]
[[0.         0.34256617 0.        ]
 [0.01773899 0.         0.12460768]
 [0.1401687  0.         0.        ]]
[[0.         0.11086942 0.        ]
 [0.01449088 0.         0.04592752]
 [0.07903259 0.         0.        ]]
[[0.         0.01970867 0.        ]
 [0.00589168 0.         0.00860802]
 [0.06942081 0.         0.        ]]
[[0.         0.01045412 0.        ]
 [0.00084878 0.         0.00713334]
 [0.0024654  0.         0.        ]]

Однако вывод getPopulation не идентичен предыдущему выводу, хотя этого следует ожидать:

[matrix([[0.        , 0.01045412, 0.        ],
         [0.00084878, 0.        , 0.00713334],
         [0.0024654 , 0.        , 0.        ]]),
 matrix([[0.        , 0.01045412, 0.        ],
         [0.00084878, 0.        , 0.00713334],
         [0.0024654 , 0.        , 0.        ]]),
 matrix([[0.        , 0.01045412, 0.        ],
         [0.00084878, 0.        , 0.00713334],
         [0.0024654 , 0.        , 0.        ]]),
 matrix([[0.        , 0.01045412, 0.        ],
         [0.00084878, 0.        , 0.00713334],
         [0.0024654 , 0.        , 0.        ]]),
 matrix([[0.        , 0.01045412, 0.        ],
         [0.00084878, 0.        , 0.00713334],
         [0.0024654 , 0.        , 0.        ]])]

Матрица параметров выглядит следующим образом:

[[0. 1. 0.]
 [1. 0. 1.]
 [1. 0. 0.]]

1 Ответ

0 голосов
/ 30 мая 2019

Итак, проблема в следующем:

def myfunction(L):
    L[0] += 1
    return L

my_outer_list = [1,2,3]
newlist = myfunction(my_outer_list)

print(newlist)
> [2, 2, 3]
print(my_outer_list)
> [2, 2, 3]

newlist[2]=-1
print(newlist)
> [2, 2, -1]
print(my_outer_list)
> [2, 2, -1]

Я передал объект my_outer_list в функцию.Затем этот объект модифицируется, и объект возвращается.Так что теперь newlist и my_outer_list не просто равны, это два разных имени для одной и той же вещи.То, что я делаю с этим объектом, меняет объект, и вы видите эти изменения независимо от того, какое имя вы используете.

Это то, что случилось с вами.Если бы вместо этого у меня было myfunction return L.copy(), он бы возвратил копию L, а не точно L.

Так что вы должны вернуть adj.copy().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...