【问题标题】:generator for iterating over the rows of a list of numpy arrays用于迭代 numpy 数组列表的行的生成器
【发布时间】:2014-10-23 05:27:02
【问题描述】:

我很难想出一个生成器来迭代存储在列表中的 numpy 数组的行。

我可以通过使用常规 for 循环来完成此操作:

list = [numpy.array([[0, 1, 2, 3, 4],
       [5, 6, 7, 8, 9]]), numpy.array([[0, -1, -2, -3, -4],
       [-5, -6, -7, -8, -9]])]

for array in list:
  for row in array:
    print(' '.join(map(str, row)))

但我想提出一个生成器,它可以用更少的代码完成这个任务。我尝试了以下方法,它可以工作,但数组行数是硬编码的:

mygen = (' '.join(map(str, i[j])) for j in range(2) for i in list)
for r in mygen:
  print (r)

现在,当我尝试将 range(2) 更改为 range(i.shape[0]) 时,我得到了 IndexError: tuple index out of range。为什么这段代码不起作用?

【问题讨论】:

    标签: python list numpy indexing generator


    【解决方案1】:

    你的尝试是正确的。您遇到的问题与嵌套列表理解中索引的优先级有关。 根据PEP-202,您应该如下使用嵌套列表推导:

    The form [... for x... for y...] nests, with the **last index
      varying fastest**, just like nested for loops.
    

    因此,如果您在列表推导中更改 for 循环的顺序,那么它会起作用:

    mygen = (' '.join(map(str, i[j])) for i in list for j in range(i.shape[0]) )
    >>> list(mygen)
    ['0 1 2 3 4', '5 6 7 8 9', '0 -1 -2 -3 -4', '-5 -6 -7 -8 -9']
    

    【讨论】:

    • 快乐是我的。记住星号中的部分,您不会弄错列表推导。
    【解决方案2】:

    您可以使用itertools.chain.from_iterable

    >>> import itertools
    >>> lst = [numpy.array([[0, 1, 2, 3, 4],
    ...        [5, 6, 7, 8, 9]]), numpy.array([[0, -1, -2, -3, -4],
    ...        [-5, -6, -7, -8, -9]])]
    >>> for r in itertools.chain.from_iterable(lst):
    ...     print(' '.join(map(str, r)))
    0 1 2 3 4
    5 6 7 8 9
    0 -1 -2 -3 -4
    -5 -6 -7 -8 -9
    

    【讨论】:

    • 感谢您的回答。你能告诉我为什么我的例子不起作用吗?
    猜你喜欢
    • 2018-11-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-16
    • 2012-04-12
    • 2018-12-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-03
    相关资源
    最近更新 更多