用于遍历numpy数组列表行的生成器

1 投票
2 回答
546 浏览
提问于 2025-04-18 19:06

我在尝试创建一个生成器,这个生成器可以遍历存储在列表中的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']

撰写回答