用于遍历numpy数组列表行的生成器
我在尝试创建一个生成器,这个生成器可以遍历存储在列表中的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 个回答
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
你的尝试基本上是对的。你遇到的问题跟嵌套列表推导式中索引的优先级有关。
根据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']