-1

我有一个 numpy 数组,其值以下列方式分布

在此处输入图像描述

从这个数组中,我需要得到一个正态分布的随机子样本。

在此处输入图像描述

我需要从数组中删除图片中红线上方的值。即我需要从数组中删除某些值的出现,以便在删除突然的峰值时我的分布变得平滑。

我的数组的分布应该是这样的: 在此处输入图像描述

这可以在 python 中实现,而无需手动查找与峰值对应的条目并删除它们的一些出现吗?这可以以更简单的方式完成吗?

4

1 回答 1

0

但是,以下类型的作品相当激进: 在此处输入图像描述

它的工作原理是对样本进行排序,转换为统一的,然后尝试选择一个规则的网格子样本。如果您觉得它过于激进,您可以增加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)
于 2017-12-08T07:02:55.887 回答