2016-12-03 65 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