2014-08-29 48 views
1

我试图想出一个迭代遍历存储在列表中的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。为什么这段代码不起作用?

回答

1

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

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

因此,如果你改变的顺序进行列表解析里循环,然后它的工作原理:

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

太好了,非常感谢! – aaragon 2014-08-29 08:54:51

+0

快乐是我的。记住星号中的部分,不会让列表解析错误。 – 2014-08-29 08:58:09

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 
+0

谢谢回答。你能否给我一些见解,说明我的例子为什么不起作用? – aaragon 2014-08-29 08:51:17