Использование list () на объекте цикла зависает система - PullRequest
0 голосов
/ 06 марта 2020

Я пытаюсь перебрать элементы массива aa, где блок for применяется не над ним, а над другим массивом bb.

import numpy as np
from itertools import cycle

aa = np.array([[399., 5., 9.], [9., 35., 2.], [.6, 15., 8842.]])
c_aa = cycle(aa)

bb = np.array([33, 1., 12, 644, 234, 77, 194, 70])
for _ in bb:
    print(c_aa)

Это не работать, он просто выводит:

<itertools.cycle object at 0x7f8d207b1640>
<itertools.cycle object at 0x7f8d207b1640>
<itertools.cycle object at 0x7f8d207b1640>
<itertools.cycle object at 0x7f8d207b1640>
<itertools.cycle object at 0x7f8d207b1640>
<itertools.cycle object at 0x7f8d207b1640>
<itertools.cycle object at 0x7f8d207b1640>
<itertools.cycle object at 0x7f8d207b1640>

Но если я изменю эту последнюю строку на print(list(c_aa)), вся моя система почти зависнет.

Что здесь происходит и как я могу выполнить итерации aa без использования в вызове for?

Ответы [ 2 ]

3 голосов
/ 06 марта 2020

Вы должны фактически выполнить итерацию по циклу, например:

for b, a_row in zip(bb, cycle(aa)):
  print(b, a_row)

Вывод:

33.0 [399.   5.   9.]
1.0 [ 9. 35.  2.]
12.0 [6.000e-01 1.500e+01 8.842e+03]
644.0 [399.   5.   9.]
234.0 [ 9. 35.  2.]
77.0 [6.000e-01 1.500e+01 8.842e+03]
194.0 [399.   5.   9.]
70.0 [ 9. 35.  2.]

Демо

2 голосов
/ 06 марта 2020

Поскольку цикл идет бесконечно, вызов list() - плохая идея, как вы обнаружили. Вы можете вызвать next() на итераторе, чтобы получить следующее значение:

import numpy as np
from itertools import cycle

aa = np.array([[399., 5., 9.], [9., 35., 2.], [.6, 15., 8842.]])
c_aa = cycle(aa)

bb = np.array([33, 1., 12, 644, 234, 77, 194, 70])
for _ in bb:
    print(next(c_aa))
...