2014-09-21 113 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] 
相關問題