在numpy中创建像“范围”这样的“正态分布”

问题描述 投票:0回答:1

我试图将一个数组“bin”成二进制数(类似于直方图)。我有一个输入数组input_array和范围bins = np.linspace(-200, 200, 200)。整体功能看起来像这样:

def bin(arr):
    bins = np.linspace(-100, 100, 200)
    return np.histogram(arr, bins=bins)[0]

所以,

bin([64, 19, 120, 55, 56, 108, 16, 84, 120, 44, 104, 79, 116, 31, 44, 12, 35, 68])

会回来:

array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0])

然而,当我接近0时,我希望我的箱子更加“细致”......类似于一个正常的分布。结果,当我接近0时,我可以有更多的箱子(即短程),当我向范围移动时,箱子更大。可能吗?

更具体地说,不是在一个范围内具有同样宽的区间,我可以有一个范围阵列,其中朝向中心的区域小于极端区域吗?

我已经看过像thisnumpy.random.normal这样的答案,但有些事情并没有点击正确。

python numpy normal-distribution
1个回答
1
投票

使用反向误差函数生成箱。您需要缩放容器以获得所需的确切范围

此变换有效,因为反向误差函数在零附近比+/- 1更平坦。

inverse error function

from scipy.special import erfinv
erfinv(np.linspace(-1,1))
# returns: 
array([       -inf, -1.14541135, -0.8853822 , -0.70933273, -0.56893556,
       -0.44805114, -0.3390617 , -0.23761485, -0.14085661, -0.0466774 ,
        0.0466774 ,  0.14085661,  0.23761485,  0.3390617 ,  0.44805114,
        0.56893556,  0.70933273,  0.8853822 ,  1.14541135,         inf])
© www.soinside.com 2019 - 2024. All rights reserved.