Numpy 努比:通过平均值来后悔?

Numpy 努比:通过平均值来后悔?,numpy,Numpy,我正在尝试将numpy数组重新填充到新网格上。在这个特定的例子中,我尝试将功率谱重新绘制到对数网格上,以便数据以对数方式均匀分布,以便绘图 使用np.interp进行直线插值会导致一些原始数据被完全忽略。使用digitalize可以得到我想要的结果,但我必须使用一些难看的循环来让它工作: xfreq = np.fft.fftfreq(100)[1:50] # only positive, nonzero freqs psw = np.arange(xfreq.size) # dummy arra

我正在尝试将numpy数组重新填充到新网格上。在这个特定的例子中,我尝试将功率谱重新绘制到对数网格上,以便数据以对数方式均匀分布,以便绘图

使用
np.interp
进行直线插值会导致一些原始数据被完全忽略。使用
digitalize
可以得到我想要的结果,但我必须使用一些难看的循环来让它工作:

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有没有更好的方法来实现这一点?我只需要替换内联循环步骤就可以了。

您可以使用
bincount()
两次来计算每个箱子的平均值:

logpsw2  = np.interp(logfreq, xfreq, psw)
counts = np.bincount(inds)
mask = counts != 0
logpsw2[mask] = np.bincount(inds, psw)[mask] / counts[mask]
或者使用
unique(inds,return\u 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

pandas
仅用于此用途就有点重,因此我喜欢
bincount
方法。我不认为这个解决方案可以用于中间值,但是-你能想出一种方法来实现中间值/百分位数吗?