我有一个 numpy 数组,其值以下列方式分布
从这个数组中,我需要得到一个正态分布的随机子样本。
我需要从数组中删除图片中红线上方的值。即我需要从数组中删除某些值的出现,以便在删除突然的峰值时我的分布变得平滑。
这可以在 python 中实现,而无需手动查找与峰值对应的条目并删除它们的一些出现吗?这可以以更简单的方式完成吗?
我有一个 numpy 数组,其值以下列方式分布
从这个数组中,我需要得到一个正态分布的随机子样本。
我需要从数组中删除图片中红线上方的值。即我需要从数组中删除某些值的出现,以便在删除突然的峰值时我的分布变得平滑。
这可以在 python 中实现,而无需手动查找与峰值对应的条目并删除它们的一些出现吗?这可以以更简单的方式完成吗?
它的工作原理是对样本进行排序,转换为统一的,然后尝试选择一个规则的网格子样本。如果您觉得它过于激进,您可以增加ns
这基本上是保留的样本数量。
另外,请注意,它需要了解真实分布。在正态分布的情况下,您应该可以使用样本均值和无偏方差估计(具有 n-1 的那个)。
代码(不绘图):
import scipy.stats as ss
import numpy as np
a = ss.norm.rvs(size=1000)
b = ss.uniform.rvs(size=1000)<0.4
a[b] += 0.1*np.sin(10*a[b])
def smooth(a, gran=25):
o = np.argsort(a)
s = ss.norm.cdf(a[o])
ns = int(gran / np.max(s[gran:] - s[:-gran]))
grid, dp = np.linspace(0, 1, ns, endpoint=False, retstep=True)
grid += dp/2
idx = np.searchsorted(s, grid)
c = np.flatnonzero(idx[1:] <= idx[:-1])
while c.size > 0:
idx[c+1] = idx[c] + 1
c = np.flatnonzero(idx[1:] <= idx[:-1])
idx = idx[:np.searchsorted(idx, len(a))]
return o[idx]
ap = a[smooth(a)]
c, b = np.histogram(a, 40)
cp, _ = np.histogram(ap, b)