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

Поэтому я пытаюсь использовать меньший список для заполнения диагонали большей матрицы. Я думал, что использование функции цикла в 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))

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


person Amanda.py    schedule 19.11.2018    source источник
comment
что ты пытаешься? установить diags на 1, затем 2, затем 3 и т. д.?   -  person Patrick Artner    schedule 19.11.2018


Ответы (1)


вы хотите использовать 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 имеет необязательный параметр для ограничения повторений).

person Jean-François Fabre    schedule 19.11.2018
comment
Я не хотел помещать цикл в свой исходный пост, упс. Но моя проблема заключалась в том, что я не использовал его как итератор вне цикла и не использовал следующий! Спасибо. - person Amanda.py; 19.11.2018
comment
это злые близнецы с бесконечным циклом при неправильном использовании :) - person Jean-François Fabre; 19.11.2018