2

numpy 配列を新しいグリッドに再グリッド化しようとしています。この特定のケースでは、プロット目的でデータが対数的に等間隔になるように、パワー スペクトルを対数グリッドに再グリッド化しようとしています。

を使用して直線補間でこれを行うnp.interpと、元のデータの一部が完全に無視されます。を使用digitizeすると、必要な結果が得られますが、機能させるにはいくつかの醜いループを使用する必要があります。

xfreq = np.fft.fftfreq(100)[1:50] # only positive, nonzero freqs
psw = np.arange(xfreq.size) # dummy array for MWE

# new logarithmic grid
logfreq = np.logspace(np.log10(np.min(xfreq)), np.log10(np.max(xfreq)), 100)

inds = np.digitize(xfreq,logfreq)

# interpolation: ignores data *but* populates all points
logpsw  = np.interp(logfreq, xfreq, psw)
# so average down where available...
logpsw[np.unique(inds)] = [psw[inds==i].mean() for i in np.unique(inds)]

# the new plot
loglog(logfreq, logpsw, linewidth=0.5, color='k')

numpyでこれを達成するためのより良い方法はありますか? インライン ループ ステップを置き換えるだけで十分です。

4

1 に答える 1

1

2 回使用bincount()して、すべてのビンの平均値を計算できます。

logpsw2  = np.interp(logfreq, xfreq, psw)
counts = np.bincount(inds)
mask = counts != 0
logpsw2[mask] = np.bincount(inds, psw)[mask] / counts[mask]

または と を 2 回使用unique(inds, return_inverse=True)bincount()ます。

logpsw4  = np.interp(logfreq, xfreq, psw)
uinds, inv_index = np.unique(inds, return_inverse=True)
logpsw4[uinds] = np.bincount(inv_index, psw) / np.bincount(inv_index)

または、パンダを使用する場合:

import pandas as pd
logpsw4  = np.interp(logfreq, xfreq, psw)
s = pd.groupby(pd.Series(psw), inds).mean()
logpsw4[s.index] = s.values
于 2013-03-10T06:12:19.677 に答える