用于迭代numpy数组列表的行的生成器

时间:2014-08-29 08:14:42

标签: python list numpy indexing generator

我在尝试使用生成器迭代存储在列表中的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。为什么这段代码不起作用?

2 个答案:

答案 0 :(得分:1)

您可以使用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

答案 1 :(得分:1)

你的尝试恰到好处。您遇到的问题与嵌套列表推导中索引的优先级有关。 根据{{​​3}},您应该使用嵌套列表理解,如下所示:

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