Как продолжать использовать значения из списка, пока диагональ матрицы не заполнится с помощью itertools - PullRequest
0 голосов
/ 19 ноября 2018

Поэтому я пытаюсь использовать меньший список для заполнения диагонали матрицы большего размера. Я думал, что использование функции цикла в itertools упростит эту задачу, но я не могу заставить ее работать. Вот что я попробовал

a = np.zeros((10,10))
b = [1, 2, 3, 4, 5]
for i in range(len(a.shape[0])):
     a[i, i] = list(itertools.cycle(b))

но это делает его бесконечно повторяющимся. Я надеюсь, что это прекратится, как только диагональ будет заполнена. Другие варианты, которые являются более питоническими, очень ценятся!

1 Ответ

0 голосов
/ 19 ноября 2018

вы хотите использовать itertools.cycle, а не repeat. Последний повторяет элемент (список), удачи, устанавливая его в значение, особенно если вы форсируете итерацию (поскольку она выполняется вечно)

Я бы создал ссылку на cycle объект вне цикла и назначил бы значение для диагонали, повторяя его вручную (единственный правильный способ с cycle). Также обратите внимание, что ваш цикл range был неправильным. a.shape[0] - это размерность, нет необходимости len

import numpy as np,itertools
a = np.zeros((10,10))
b = [1, 2, 3, 4, 5]
iterator = itertools.cycle(b)
for i in range(a.shape[0]):
     a[i, i] = next(iterator)

результат:

>>> a
array([[ 1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  2.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  3.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  4.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  5.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  1.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  2.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  3.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  4.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  5.]])

Поскольку они зацикливаются навсегда, cycle и repeat не должны использоваться в контексте принудительной итерации (однако, repeat имеет необязательный параметр для ограничения повторов).

...