gpt4 book ai didi

python - Numpy 2d 直方图总和不为 1

转载 作者:太空宇宙 更新时间:2023-11-03 15:09:16 25 4
gpt4 key购买 nike

我认为我误解了 Numpy 的 histogram2d rangebin 参数。

这是一个按照我的预期工作的示例:

d, x_r, y_r = np.histogram2d(
[0, 1, 3],
[0, 1, 3],
bins=[3, 3],
range=[[0, 3], [0, 3]],
normed=True)

d
array([[ 0.33333333, 0. , 0. ],
[ 0. , 0.33333333, 0. ],
[ 0. , 0. , 0.33333333]])
np.sum(d)
1.0

这就是我的事情开始崩溃的地方(增加垃圾箱数量):

d, x_r, y_r = np.histogram2d(
[0, 1, 3],
[0, 1, 3],
bins=[3, 6],
range=[[0, 3], [0, 3]],
normed=True)
d
array([[ 0.66666667, 0., 0. , 0., 0., 0. ],
[ 0. , 0., 0.66666667, 0., 0., 0. ],
[ 0. , 0., 0. , 0., 0., 0.66666667]])
np.sum(d)
2.0

我本来期望:

d
array([[ 0.33333333, 0., 0. , 0., 0., 0. ],
[ 0. , 0., 0.33333333, 0., 0., 0. ],
[ 0. , 0., 0. , 0., 0., 0.33333333]])

如果您能帮助理解这一点并获得我正在寻找的结果,我将不胜感激。谢谢。

最佳答案

np.histogram2d 中的规范化参数标准化如下

bin_count / sample_count / bin_area

这些需要一段时间才能理解,而source code我认为写得不太好(变量名选择不当)

  • bin_count 是直方图 bin 中的值
  • sample_count 是所有 bin_count 的总和
  • bin_area 是特定 bin 的区域

我们可以在这两种情况下定义上述 3 个变量,无需使用规范参数,然后看看发生了什么:

案例1

bin_count, binsx, binsy = np.histogram2d( [0,1,3], [0,1,3], 
bins=[3,3], range=[[0,3],[0,3]], normed=False)

如果您查看 binsxbinsy,您将看到每个 bin 的面积为 1

print(binsx, binsy)
#In [54]: print (binsx, binsy)
#(array([ 0., 1., 2., 3.]), array([ 0., 1., 2., 3.]))

因此,我们让 bin_area=1 和二维直方图归一化看起来像

bin_count / bin_count.sum() / bin_area

#array([[ 0.33333333, 0. , 0. ],
#[ 0. , 0.33333333, 0. ],
#[ 0. , 0. , 0.33333333]])

案例2

bin_count, binsx, binsy = np.histogram2d( [0,1,3], [0,1,3], 
bins=[3,6], range=[[0,3],[0,3]], normed=False)
print(binsx, binsy)
#(array([ 0., 1., 2., 3.]), array([ 0. , 0.5, 1. , 1.5, 2. , 2.5, 3. ]))

现在您可以看到您的 bin_area 减少了 2 倍(因为您将 y-bin 的数量增加了 2 倍)

因此,我们让bin_area=.5,并且归一化历史看起来像

bin_count / bin_count.sum() / bin_area

#array([[ 0.66666667, 0. , 0. , 0. , 0. ,
# 0. ],
# [ 0. , 0. , 0.66666667, 0. , 0. ,
# 0. ],
# [ 0. , 0. , 0. , 0. , 0. ,
# 0.66666667]])

一般情况

一般来说,您可以拥有可变大小的容器,因此 bin_area 可能是一个变量。考虑一些非偶数箱:

bin_count, binsx, binsy = np.histogram2d( [0,1,3], [0,1,3], 
bins=([0.,1.5,3.],[0, .6, 1.7,3.]),
range=[[0,3],[0,3]], normed=False)

在本例中,显式计算每个 bin 的面积:

bin_area = np.array( [ [(x1 -x0)* (y1-y0) 
for y1,y0 in zip(binsy[1:], binsy[:-1])]
for x1,x0 in zip(binsx[1:], binsx[:-1]) ] )

print(bin_area)
#array([[ 0.9 , 1.65, 1.95],
# [ 0.9 , 1.65, 1.95]])

bin_count / bin_count.sum() / bin_area
#array([[ 0.37037037, 0.2020202 , 0. ],
# [ 0. , 0. , 0.17094017]])

确实,如果我们将规范参数设置为 True

normed_bin_count, binsx, binsy = np.histogram2d( [0,1,3], [0,1,3], 
bins=([0.,1.5,3.],[0, .6, 1.7,3.]),
range=[[0,3],[0,3]], normed=True)
print(normed_bin_count)
#array([[ 0.37037037, 0.2020202 , 0. ],
# [ 0. , 0. , 0.17094017]])

关于python - Numpy 2d 直方图总和不为 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44369799/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com