【问题标题】:Using list() on cycle object hangs system在循环对象上使用 list() 会挂起系统
【发布时间】:2020-03-06 17:33:58
【问题描述】:

我正在尝试循环遍历数组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)),我的整个系统几乎都会挂起。

这里发生了什么,如何在不使用 for 调用的情况下迭代 aa

【问题讨论】:

    标签: python numpy itertools cycle


    【解决方案1】:

    您需要实际迭代循环,例如:

    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.]
    

    Demo

    【讨论】:

      【解决方案2】:

      正如您所发现的,由于循环无限循环,因此调用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))
      

      【讨论】:

      • 我认为这是更清洁的选择,所以我选择了这个,但亚历克斯的回答也是一个好方法。谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-02
      • 1970-01-01
      • 1970-01-01
      • 2013-06-23
      • 2017-09-11
      • 2014-06-11
      • 2011-06-13
      相关资源
      最近更新 更多