迭代NumPy数组的列和另一个数组的元素?

时间:2014-09-21 16:51:19

标签: python arrays numpy

我正在尝试复制zip(a, b)的行为,以便能够同时沿两个NumPy数组循环。特别是,我有两个数组ab

a.shape=(n,m)
b.shape=(m,) 

我想为每个循环获取a列和b元素。

到目前为止,我尝试了以下内容:

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

但是,我会打印元素a[0,0]而不是我想要的列a[0,:]

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

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

在您的情况下,您需要首先转置a,使其成为形状(m,n)的数组,即长度为m的可迭代:

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

答案 1 :(得分:1)

shallow iteration with nditer中调整我的答案, nditerndindex可用于通过生成索引来迭代行或列。

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]

答案 2 :(得分:0)

通常,由于NumPy具有broadcast arrays的能力,因此没有必要逐个遍历数组的列。例如,如果a的形状为(n,m)b的形状为(m,),那么您可以添加a+b,而b会自行广播(n, m) {1}}自动。

此外,如果可以通过对整个数组a的操作表达,而不是通过使用Python对a(例如在列上)的操作进行表达,则计算将更快地完成for-loop

话虽如此,循环遍历a列的最简单方法是迭代索引:

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