2016-12-03 67 views
2

我想借此每2個元素的平均值在每列平均列子集的2D numpy的陣列中的所有列的

這裏是爲了方便陣列:

p = np.array([[1, 2, 3, 4, 5, 6], 
       [10, 12, 21, 12, 11, 51], 
       [743,123,1,42,12,9], 
      [51, 21, 31, 13, 12, 10], 
      [76, 12 , 11,88, 90, 12]]) 

我想讓每兩個連續元素的平均值爲每列:

p[0][0:2].mean() # mean of first 2 elements of the 1st column 

這是我已經實現了(感謝sirfz answer)做,雖然我想擺脫的for循環如果可能的話(全光照摹numpy的只),並取回一個numpy的陣列,而無需手動做到這一點:?

parr = p[-1,:]; 
for i in range(3-1): 
    tmp = p[i*2:i*2+2,:].mean(axis=0) 
    parr = np.vstack([parr, tmp]) 
parr = np.roll(parr, -1, axis = 0) 

返回

array([[ 5.5, 7. , 12. , 8. , 8. , 28.5], 
     [ 397. , 72. , 16. , 27.5, 12. , 9.5], 
     [ 76. , 12. , 11. , 88. , 90. , 12. ]]) 

更新:我結束了編輯接受的答案,以適應取均值在更多的元素上。被接受的答案的問題是在奇數行或列的情況下單獨的行或列。

ii = 2 # number of elements to average 
if rows % 2 != 0: 
    rows -= 1 
    parr = p[:rows].reshape((np.int(rows/ii), ii, cols)).mean(axis=1) 
    parr = np.vstack([parr, p[-1]]) 

回答

3

mean方法把一個axis參數。據我瞭解,你要找的是什麼:

import numpy as np 

p = np.random.randn(20, 30) 
means = p[:, :10].mean(axis=1) 

以上產生類似的結果:

array([-0.45358033, 0.08746795, 0.04517895, 0.08501094, -0.16296425, 
     0.48717193, 0.4581073 , 0.24285689, 0.46419295, -0.51888609, 
     -0.04200014, -0.64716378, 0.09296176, -0.53195615, 0.3466912 , 
     0.38070856, -0.80346158, -0.47310487, 0.13224299, 0.09014788]) 

要回答你的問題更新,也可以沒有循環做如下:

p = np.array([[1, 2, 3, 4, 5, 6], 
       [10, 12, 21, 12, 11, 51], 
       [743,123,1,42,12,9], 
       [51, 21, 31, 13, 12, 10], 
       [76, 12 , 11,88, 90, 12]]) 
rows, columns = p.shape 
# check if rows of p is divisible by 2 
if rows % 2 != 0: 
    # duplicate last row to be included in mean 
    p = np.vstack([p, p[-1]]) 
    # we added a new row 
    rows += 1 
mean = p.reshape((rows/2, 2, columns)).mean(axis=1) 

該解決方案比我的計算機上的循環方法快2.2到3.6倍。

也許隨着進一步的調整,你可以想出更好的解決方案,但這應該有所幫助。

+0

謝謝。你的答案可以幫助我擺脫一個循環,但我仍然需要循環遍歷整個列。 (PS:你的答案翻轉我的需求,但有幫助)。我也更新了這個問題。 – user10853

+0

@ user10853結帳我的更新的解決方案,您的問題,希望這可以幫助 – sirfz

+0

我結束編輯它輕微。我離開堆行(&列)到if語句的末尾,因爲我正在處理更大的數組,並且需要更大的子集的意思。 順便說一句,沒有一個函數在numpy或pandas或其他模塊中做類似的功能嗎? – user10853