4

さまざまなサイズの配列があり、そこから連続する n 個の数値を平均化し、結果として別の配列を作成します。

私は2つの異なる方法を思いつきましたが、それぞれに問題があり、これがこれを解決する最善の方法であるかどうかはわかりません:

  1. numpy.array_split() 関数の使用:

    import numpy as np
    no_splits = 3 #Or any number user defines
    no_items = int(np.random.random(1)*100) # To get a variable number of items
    pre_array = np.random.random(no_items)
    mean_array = np.mean(np.array_split(pre_array,no_splits)) 
    #This is efficient but gives an error if len(pre_array)%no_splits != 0
    
  2. enumerate(pre_array) 代替:

    mean_array = [np.mean(pre_array[i-no_splits+1:i]) for i, x in enumerate(pre_array) if i%no_splits == 0 and i != 0] 
    

これは問題ありませんが、i%no_splits != 0 の場合は最後の値をクリップします。理想的には、コードをコンパクトに保ちながら、残りの値の平均である最後の値を作成します。

これはそれぞれ私の目的のために機能しますが、より大きな配列に対して最も効率的かどうかはわかりません。

前もって感謝します!

4

2 に答える 2

1
no_splits = 3
no_items = 100
a = np.random.rand(no_items)

no_bins = no_splits + no_items % no_splits
b = np.empty((no_bins,), dtype=a.dtype)
endpoint = no_items//no_splits

b[:no_splits] = np.mean(a[:endpoint*no_splits].reshape(-1, endpoint),
                       axis=-1)
b[no_splits:] = np.mean(a[endpoint*no_splits:])
>>> b
array([ 0.49898723,  0.49457975,  0.45601632,  0.5316093 ])
于 2013-08-30T18:28:48.490 に答える