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