scipy.stats.mode
の実装では、多次元配列でaxis
引数を処理するためのPythonのループを有します。
def mode1(x):
values, counts = np.unique(x, return_counts=True)
m = counts.argmax()
return values[m], counts[m]
次の例は、1次元配列の場合の例です。まず、scipy.stats.mode
とmode1
は、同じ結果を与えることを長さ1000000
In [40]: x = np.random.randint(0, 1000, size=(2, 1000000)).sum(axis=0)
In [41]: x.shape
Out[41]: (1000000,)
チェックして整数の配列を作ります。
In [42]: from scipy.stats import mode
In [43]: mode(x)
Out[43]: ModeResult(mode=array([1009]), count=array([1066]))
In [44]: mode1(x)
Out[44]: (1009, 1066)
パフォーマンスを確認します。 mode(x)
ため
In [45]: %timeit mode(x)
2.91 s ± 18 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
In [46]: %timeit mode1(x)
39.6 ms ± 83.8 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
2.91秒とmode1(x)
のための唯一の39.6ミリ秒。それはそれをソートするように、この変異するには/入力配列を変更すること
def mode1d(ar_sorted):
ar_sorted.sort()
idx = np.flatnonzero(ar_sorted[1:] != ar_sorted[:-1])
count = np.empty(idx.size+1,dtype=int)
count[1:-1] = idx[1:] - idx[:-1]
count[0] = idx[0] + 1
count[-1] = ar_sorted.size - idx[-1] - 1
argmax_idx = count.argmax()
if argmax_idx==len(idx):
modeval = ar_sorted[-1]
else:
modeval = ar_sorted[idx[argmax_idx]]
modecount = count[argmax_idx]
return modeval, modecount
注 -
サウンドIO結合残りとして私の意見ではコードが最適です。だからあなたのhdfをチェックしてください。バッファ、圧縮、および共同。また、scipy.statsには中央値と呼ばれる関数がなく、ドキュメントを読むことで簡単にチェックできます。 numpyの中央値を使うことができます。 – sascha
@saschaファイルは0.02秒で読み込まれます。このコード行 "scipy.stats.median(my_array)"でモードを計算するのに15分の時間が費やされます。 – Heli
あなたのタイミングが、これらの合成例とは多少異なっているので、私は間違っていることを示しています。 – sascha