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