对numpy数组的每n个元素求平均值

use*_*183 45 python numpy average

我有一个numpy数组.我想创建一个新的数组,它是每个连续三元素的平均值.因此,新阵列将是原始阵列的三分之一.

举个例子:

 np.array([1,2,3,1,2,3,1,2,3])
Run Code Online (Sandbox Code Playgroud)

应该返回数组:

 np.array([2,2,2])
Run Code Online (Sandbox Code Playgroud)

有人能建议一种有效的方法吗?我画的是空白.

Jai*_*ime 75

如果您的数组arr的长度可被3整除:

np.mean(arr.reshape(-1, 3), axis=1)
Run Code Online (Sandbox Code Playgroud)

重塑为更高维度的阵列,然后在其中一个附加维度上执行某种形式的缩小操作是numpy编程的主要内容.

  • Jaime - 谢谢你,这是一种非常优雅的做事方式.你有什么建议可以读到这些所谓的"numpy编程的主要内容"吗? (16认同)
  • 如果`arr`长度不能被3整除,你可以这样做:`arr = np.nanmean(np.pad(arr.astype(float),(0,3-arr.size%3),mode ='常量',constant_values = np.NaN).reshape(-1,3),轴= 1) (7认同)
  • 对于不一定要被3整除的数组,我使用了`np.mean(arr [:( len(arr)// 3)* 3] .reshape(-1,3),axis = 1)`,这似乎简单得多对我来说。我相信这将适用于python2和python3 (3认同)
  • @ plong0的填充注释对我有帮助,但是为了使它通用,即使您的数组也可以被3整除,它也可以正常工作,我不得不在填充大小上添加另一个mod:`(0,((3-arr.size %3)%3))`,或类似((如果是arr.size%3 == 0,则为0,否则为3-arr.size%3)`之类的东西 (2认同)
  • @Chris那不一样,因为它只是丢弃最后一组中的数据(如果它不是一组3),而上面的解决方案也适用于其余组。 (2认同)

L_W*_*L_W 5

让Google寻找一个简单概括为具有多个尺寸的阵列:该函数block_reducescikit-image模块(链接到文档)。

它有一个非常简单的接口,可以通过应用诸如 之类的函数来对数组进行下采样numpy.mean,但也可以使用其他函数(最大值、中值等)。通过为块提供具有不同大小的元组,可以通过不同轴的不同因素来完成下采样。这是一个二维数组的例子;使用平均值仅对轴 1 进行 5 下采样:

import numpy as np
from skimage.measure import block_reduce

arr = np.stack((np.arange(1,20), np.arange(20,39)))

# array([[ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19],
#        [20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38]])

arr_reduced = block_reduce(arr, block_size=(1,5), func=np.mean, cval=np.mean(arr))

# array([[ 3. ,  8. , 13. , 17.8],
#        [22. , 27. , 32. , 33. ]])
Run Code Online (Sandbox Code Playgroud)

正如在另一个答案的评论中所讨论的那样:如果减少维度中的数组不能被块大小整除,则填充值由参数提供cval(默认为 0)。