Zip со слоями и частью слоев, которая начинается со второго элемента.Обратите внимание, что zip()
остановится, как только истечет любая из его итераций.
for L0, L1 in zip(layers, layers[1:]):
weights[L0] = np.random.rand(
L1.node_cardinality,
L0.node_cardinality + 1
)
В зависимости от типа последовательности layers
, может быть более эффективно использовать itertools.islice
вместонормальный срез.Numpy массив, вероятно, будет просто использовать представление, если вы нарежете.Но список должен был бы создать (неглубокую) копию, поэтому островок лучше, если он очень длинный.
for L0, L1 in zip(layers, islice(layers, 1, None)):
weights[L0] = np.random.rand(
L1.node_cardinality,
L0.node_cardinality + 1
)
Как указывал GrazingScientist, это также можно сделать с помощью точного понимания.
weights.update(
{
L0: np.random.rand(L1.node_cardinality, L0.node_cardinality + 1)
for L0, L1 in zip(layers, layers[1:])
}
)
Но этот подход должен будет генерировать новый dict перед обновлением, что может занять больше памяти.Цикл for, вероятно, лучше, если layers
длинный.Но дикты содержат только ссылки, так что это, вероятно, не намного хуже, чем использование обычного среза списка.
В этом случае было бы более эффективно использовать выражение генератора.Метод .update()
также может принимать итерируемые пары (k, v)
, но генератору не нужно выделять их все сразу.Это просто делает пару за один раз.
weights.update(
(L0, np.random.rand(L1.node_cardinality, L0.node_cardinality + 1))
for L0, L1 in zip(layers, islice(layers, 1, None))
)