2014-09-21 111 views
2

我想复制zip(a,b)的行为,以便能够沿着两个numpy数组同时循环。特别是,我有两个数组a和b(a.shape =(n,m)和b.shape =(m,))。我想为每个循环获取a的一列和b的一个元素。我怎样才能做到这一点?迭代numpy数组的列和另一个元素的列?

我试过如下:

for a_column, b_element in np.nditer([a, b]): 
    print(a_column) 

,但我得到的印刷元素a[0,0]而不是列a[0,:],这是我想要的。我该如何解决这个问题?

回答

1

您仍然可以在numpy数组上使用zip,因为它们是可迭代的。

在你的情况,你需要转a第一,使其形状(m,n)阵列,即长度m的迭代:

for a_column, b_element in zip(a.T, b): 
    ... 
+1

这是最Python的答案。 'np.nditer'可能更强大,但是更加丑陋。例如,您必须回顾C和Fortran排序之间的区别。 – cxrodgers 2014-09-21 21:27:00

0

通常情况下,由于与NumPy的能力broadcast arrays,它没有必要一个接一个遍历数组的列。例如,如果a已形成(n,m)b已形状(m,)那么您可以添加a+bb将自动广播自己形状(n, m)自动。此外,如果可以通过整个数组a上的操作来表示,而不是通过使用Python for-loopa(例如在列上)进行操作来表示,则您的计算将完成得更快。

说了这么多,通过的a列循环的最简单方法是迭代指数:

for i in np.arange(b.shape[0]): 
    a_column, b_element = a[:, i], b[i] 
    print(a_column) 
1

适应我的答案在shallow iteration with nditernditerndindex可用于迭代行或列通过生成索引。

In [19]: n,m=3,4 
In [20]: a=np.arange(n*m).reshape(n,m) 
In [21]: b=np.arange(m) 

In [22]: it=np.nditer(b) 
In [23]: for i in it: print a[:,i],b[i] 
[0 4 8] 0 
[1 5 9] 1 
[ 2 6 10] 2 
[ 3 7 11] 3 

In [24]: for i in np.ndindex(m):print a[:,i],b[i] 
[[0] 
[4] 
[8]] 0 
[[1] 
[5] 
[9]] 1 
[[ 2] 
[ 6] 
[10]] 2 
[[ 3] 
[ 7] 
[11]] 3 
In [25]: 

ndindex使用像一个迭代器:it = np.nditer(b, flags=['multi_index']

对于像这样的单个维度的迭代,for i in range(m):也适用。

也从另一个线程,这是一个使用order没有指标迭代一招:

In [28]: for i,j in np.nditer([a,b],order='F',flags=['external_loop']): 
    print i,j 
[0 4 8] [0 0 0] 
[1 5 9] [1 1 1] 
[ 2 6 10] [2 2 2] 
[ 3 7 11] [3 3 3] 
相关问题