我正在尝试复制zip(a, b)
的行为,以便能够同时沿两个NumPy
数组循环。特别是,我有两个数组a
和b
:
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,:]
。
我该如何解决这个问题?
答案 0 :(得分:1)
你仍然可以在numpy数组上使用zip
,因为它们是可迭代的。
在您的情况下,您需要首先转置a
,使其成为形状(m,n)
的数组,即长度为m
的可迭代:
for a_column, b_element in zip(a.T, b):
...
答案 1 :(得分:1)
在shallow iteration with nditer中调整我的答案,
nditer
和ndindex
可用于通过生成索引来迭代行或列。
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)