如何对数组的每个部分取平均值

时间:2016-12-08 21:40:52

标签: arrays matlab numpy vectorization mean

假设我有一个名为500000x1的{​​{1}}数组。我想将此数组划分为A个相等的部分,然后计算该部分的平均值。所以我最终会得到一个名为1000的{​​{1}}数组,其中1000x1B的平均值,B[1]是B的平均值[501: 1000]`等等。由于我将多次这样做,我想有效地做到这一点。在Matlab / Python中这样做最有效的方法是什么?

1 个答案:

答案 0 :(得分:3)

<强> NumPy的/ Python的

我们可以重塑500列,然后沿第二轴计算平均值 -

A.reshape(-1,500).mean(axis=1)

示例运行 -

In [89]: A = np.arange(50)+1;

In [90]: A.reshape(-1,5).mean(1)
Out[90]: array([  3.,   8.,  13.,  18.,  23.,  28.,  33.,  38.,  43.,  48.])

运行时测试:

获得这些平均值的另一种方法是采用传统的计算总和的方法,然后除以求和中涉及的元素数。让我们来看看这两种方法 -

In [107]: A = np.arange(500000)+1;

In [108]: %timeit A.reshape(-1,500).mean(1)
1000 loops, best of 3: 1.19 ms per loop

In [109]: %timeit A.reshape(-1,500).sum(1)/500.0
1000 loops, best of 3: 583 µs per loop

看起来像是替代方法的改进!但是等等,因为使用mean方法,NumPy默认转换为float类型,并且转换开销出现在这里。

因此,如果我们使用float类型的输入数组,我们会有一个不同的公平场景 -

In [144]: A = np.arange(500000).astype(float)+1;

In [145]: %timeit A.reshape(-1,500).mean(1)
1000 loops, best of 3: 534 µs per loop

In [146]: %timeit A.reshape(-1,500).sum(1)/500.0
1000 loops, best of 3: 516 µs per loop

<强> MATLAB

使用列主要排序时,我们会重新设置500行,然后沿第一维进行平均 -

mean(reshape(A,500,[]),1)

示例运行 -

>> A = 1:50;                      
>> mean(reshape(A,5,[]),1)        
ans =
     3     8    13    18    23    28    33    38    43    48

运行时测试:

让我们在这里尝试老式的方式 -

>> A = 1:500000;
>> func1 = @() mean(reshape(A,500,[]),1);
>> timeit(func1)                         
ans =
    0.0013021
>> func2 = @() sum(reshape(A,500,[]),1)/500.0;
>> timeit(func2)                              
ans =
    0.0012291