2016-12-08 11 views
1

Aという500000x1配列があるとします。私は1000等しいセクションにこの配列を分割し、そのセクションの平均を計算したいと思います。そこで、Bという1000x1という配列になります。B[1]は、A[1:500]の平均であり、B[2]はB [501:1000]の平均です。私はこれを何度もやっていますので、効率的にやりたいと思います。 Matlab/Pythonでこれを行う最も効果的な方法は何ですか?配列の各部分の平均を取る方法

答えて

3

numpyの/ Pythonの

我々は500の列を持っているし、その後、第2の軸に沿って平均値を計算するために作り変えることができ -

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

ランタイムテスト:

これらの平均値を得る別の方法は、合計を計算して合計に含まれる要素の数で除算する従来の方法です。これら2つの方法を試してみましょう。

他の方法でもかなり改善が見られます。しかし、それは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の行を持ち、その後最初の次元に沿って平均する -

サンプル実行 -

>> 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 
+0

おそらく 'リシェイプ(A、[]、1000)'多くを作ります感覚、質問の定義を与えて –

+0

@ルイスメンド私は各セクションの長さを使用する別の方法を見ていたと思う。 – Divakar

+0

'np.mean(x)'は基本的に 'np.sum(x、dtype = float)/ 500'と同じです。 'dtype'を持たない' sum'は、 'float64'を追加するのではなく' uint32'を追加するので、オーバーフローの危険があります。それはmatlabがスマートであることではない、それはより慎重であるということです – Eric

関連する問題