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