2016-03-03 84 views
3
選擇特定陣列

想象我有這樣的事情:迭代和多維數組在Python

import numpy as np 
arra = np.arange(16).reshape(2, 2, 4) 

這給

array([[[0, 1, 2, 3], 
     [4, 5, 6, 7]], 
     [[8, 9, 10, 11], 
     [12, 13, 14, 15]]])  

,我想使沿特定子陣列運行一個循環(在這種情況下,我想沿每個'矩陣'的每個'列')運算結果(即選擇0和4並將它們相加(4),選擇1和5並將它們相加(6), ...,選擇3和7並將它們相加(10),選擇8和12並將它們相加(20),...,選擇11和15並將它們相加(26))。

我原以爲這樣做與自然明顯:

for i in arra[i, j, k]: 
    for j in arra[i, j, k]: 
     for k in arra[i, j, k]: 
      sum... 

問題是Python的肯定不允許做什麼,我想用這種方式。如果它是二維數組,它會更容易,因爲我知道迭代器首先遍歷行,所以可以轉置爲沿列運行,但對於多維(此例中爲3D)數組(N,M,P)與N,M,P >> 1,我想知道如何做到這一點。

編輯:這個問題在這裏有一個延續:Choosing and iterating specific sub-arrays in multidimensional arrays in Python

回答

1

您可以使用map來完成這件事:

import numpy as np 
arra = np.arange(16).reshape(2, 2, 4) 

然後命令:

map(sum, arra) 

給你所需輸出:

[array([ 4, 6, 8, 10]), array([20, 22, 24, 26])] 

或者,你也可以使用一個list comprehension

res = [sum(ai) for ai in arra] 

然後res看起來是這樣的:

[array([ 4, 6, 8, 10]), array([20, 22, 24, 26])] 

編輯:

如果你想添加相同的行 - 如你在這個答案下面的評論中提到 - 你可以這樣做(使用zip):

map(sum, zip(*arra)) 

它給你所需要的輸出:

[array([ 8, 10, 12, 14]), array([16, 18, 20, 22])] 

爲了完整起見也榜上有名理解:

[sum(ai) for ai in zip(*arra)] 

它給你同樣的輸出。

+0

謝謝,你的回答是非常有用的,但我想知道...,想象你有興趣,在與前面相同的例子中,總結偶數行的值,即0 + 8,1 + 9 ,2 + 10,...,4 + 12,7 + 15(按列求和,但以偶數行求和)。有沒有一個通用的方法來做到這一點? – David

+1

@大衛:當然。我編輯了我的答案,併爲此添加了解決方案。 – Cleb

+0

謝謝,但我仍然想知道是否有更通用的方法。想象一下,我想添加第一個與最後一個,中間,即0 + 12,1 + 13,...,4 + 8,5 + 9,... 7 + 11。還有可能嗎?你需要巧妙的座標轉換嗎? – David