我试图将一个数组“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时,我可以有更多的箱子(即短程),当我向范围移动时,箱子更大。可能吗?
更具体地说,不是在一个范围内具有同样宽的区间,我可以有一个范围阵列,其中朝向中心的区域小于极端区域吗?
我已经看过像this和numpy.random.normal这样的答案,但有些事情并没有点击正确。
使用反向误差函数生成箱。您需要缩放容器以获得所需的确切范围
此变换有效,因为反向误差函数在零附近比+/- 1更平坦。
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])