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

Arrays 如何对数组的每个部分求平均值,arrays,matlab,numpy,vectorization,mean,Arrays,Matlab,Numpy,Vectorization,Mean,假设我有一个名为a的500000x1数组。我想把这个数组分成1000相等的部分,然后计算该部分的平均值。因此,我将以一个名为B的1000x1数组结束,其中B[1]是a[1:500]的平均值,B[2]是B[501:1000]的平均值,依此类推。因为我会做很多次,所以我想做得更有效率。在Matlab/Python中,最有效的方法是什么 NumPy/Python 我们可以重塑为有500列列,然后沿第二个轴计算平均值- A.reshape(-1,500).mean(axis=1) 样本运行- In [

假设我有一个名为
a
500000x1
数组。我想把这个数组分成
1000
相等的部分,然后计算该部分的平均值。因此,我将以一个名为
B
1000x1
数组结束,其中
B[1]
a[1:500]
的平均值,
B[2]
是B[501:1000]的平均值,依此类推。因为我会做很多次,所以我想做得更有效率。在Matlab/Python中,最有效的方法是什么

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.])
>> A = 1:50;                      
>> mean(reshape(A,5,[]),1)        
ans =
     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类型,转换开销显示在这里

所以,如果我们使用浮点型输入数组,我们将有一个不同的公平场景-

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)
样本运行-

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.])
>> 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

考虑到这个问题,
重塑(A,[],1000)
可能更有意义definition@LuisMendo嗯,我想我是在用另一种方法来使用每个部分的长度。
np.mean(x)
基本上等于
np.sum(x,dtype=float)/500
。没有
dtype
sum
速度更快,因为它执行
uint32
加法而不是
float64
加法,有溢出的风险。这并不是说matlab很聪明,而是它更聪明cautious@Eric绝对地让我把这个评论添加到帖子里,谢谢@Divakar:我不希望实际的开销出现在int->float转换中,但我想我不应该感到惊讶。所以我猜
int+float
int+int
float+float