2017-04-10 248 views
1

考慮兩個numpy的陣列選擇元素

array1 = np.arange(0,6) 
array2 = np.arange(0,12) 

我想一個運行迴路(優選列表中理解),其中希望輸出爲單輪是

print(array1[0]) 
print(array2[0],array2[1]) or 

print(array1[1]) 
print(array2[2], array2[3]) 

即循環運行六次,但對於array1中的每一輪,它都會從array2中選擇兩個連續的元素。

我已經試過類似

for i in xrange(array1): 
    for v in xrange(array2): 

但這顯然運行的第一個內第二圈,我怎麼能同時運行它們,但在一個回合每個陣列選擇不同數量的元素?

我也試圖使迴路長度相等如

array1 = np.repeat(np.arange(0,6),2).ravel() 
array1 = [0,0,1,1,2,2.....5,5] 

然而,這將使兩個數組的長度相等,但我仍然不能得到所需的輸出

(在實際情況下,陣列的元素是熊貓系列對象)

+2

重塑第二陣列:'array2.reshape(-1,2)',然後使用相同的迭代索引來索引到'array1'和重構'array2'? – Divakar

+0

這與熊貓無關。已移除標記。 –

+0

@Divakar。感謝提醒我'-1'形狀。我會將其納入我的答案。 –

回答

0
for i in xrange(array1): 
    print(array1[i]) 
    print(array2[2*i],array2[2*i+1]) 
2

有很多不同的方式去做這件事。你可以做的一件事是使用索引:

for ind, item in array1: 
    print(item, array2[2*ind:2*ind+2]) 

但是,這並不使用numpy的全部力量。我能想到的最簡單的事情是將數組連接成一個包含所需序列的單個數組。你可以把它變成一個二維數組,便於重複,其中每列或行會是你想要三個元素的順序:

array1 = np.arange(6) 
array2 = np.arange(12) 
combo = np.concatenate((array1.reshape(-1, 1), array2.reshape(-1, 2)), axis=1) 
for row in combo: 
    print(row) 

結果

[0 0 1] 
[1 2 3] 
[2 4 5] 
[3 6 7] 
[4 8 9] 
[ 5 10 11] 

在這種情況下,明確的重塑的array1是必要的,因爲array1.T將導致1D數組。

您可以使用這兩種方法的混合,如@Divakar建議,在那裏你重塑a2,而是使用索引迭代:

array3 = array2.reshape(-1, 2) 
for ind, item in array1: 
    print(item, array3[ind]) 
+0

而且''reshape''沒有額外的內存需求。 – Divakar

+0

@Divakar是否因爲如果可能的話它返回'數組視圖'? – kmario23

+1

@ kmario23沒錯!做:'array2.reshape(-1,2)[2] = 99',你會改變'array2'本身。 – Divakar

2

是的,作爲@MadPhysicist提到的,有很多的方式來爲此....但最簡單的是

>>> for x,y,z in zip(array1,array2[:-1:2],array2[1::2]): 
... print x,y,z 
... 
0 0 1 
1 2 3 
2 4 5 
3 6 7 
4 8 9 
5 10 11 
+0

你也可以做'zip(array1,* array2.reshape(-1,2).T)'。無論哪種方式,使用zip的+1。 –

+0

謝謝@MadPhysicist,我相信我的版本(也許更少Pythonical),但更具可讀性。 – rth

+1

我留下的評論更多的是對未來的讀者的一個側面說明,而不是對你的真實評論。我同意你寫的方式是最好的。只有在列數大於2的情況下,我的工作纔會更好。 –