我有一个我用numpy生成的2D直方图:
H, xedges, yedges = np.histogram2d(y, x, weights=mass * (1.0 - pf),
bins=(yrange,xrange))
请注意,我目前正在使用质量函数来衡量分档(mass
是一个与x
和y
具有相同尺寸的numpy数组。这些箱子是对数的(通过xrange = np.logspace(minX, maxX, 100)
生成)。
然而,我真的想通过质量函数对容器进行加权,但是将它们归一化(即除以)每个区域的区域:例如 - 每个垃圾箱都有区域xrange[i] * yrange[i]
。但是,由于xrange
和yrange
与mass
,x
和y
具有相同的维度,因此我无法做到只需将规范化置于np.histogram2d
调用中即可。
如何按每个日志区中的区域规范化bin计数?
作为参考,这里是情节(我已经添加了x和y 1D直方图,我还需要根据垃圾箱的宽度进行标准化,但是一旦我弄清楚如何做对于2D它应该是类似的。)
仅供参考 - 我使用matplotlib生成主(和轴直方图):
X,Y=np.meshgrid(xrange,yrange)
H = np.log10(H)
masked_array = np.ma.array(H, mask=np.isnan(H)) # mask out all nan, i.e. log10(0.0)
cax = (ax2dhist.pcolormesh(X,Y,masked_array, cmap=cmap, norm=LogNorm(vmin=1,vmax=8)))
答案 0 :(得分:2)
我认为您只想将normed=True
传递给np.histogram2d
:
标准: bool,可选
如果
False
,则返回每个bin中的样本数。如果True
,则返回bin密度bin_count / sample_count / bin_area
。
如果您想计算bin区域并手动进行规范化,最简单的方法可能是使用broadcasting:
x, y = np.random.rand(2, 1000)
xbin = np.logspace(-1, 0, 101)
ybin = np.logspace(-1, 0, 201)
# raw bin counts
counts, xe, ye = np.histogram2d(x, y, [xbin, ybin])
# size of each bin in x and y dimensions
dx = np.diff(xbin)
dy = np.diff(ybin)
# compute the area of each bin using broadcasting
area = dx[:, None] * dy
# normalized counts
manual_norm = counts / area / x.shape[0]
# using normed=True
counts_norm, xe, ye = np.histogram2d(x, y, [xbin, ybin], normed=True)
print(np.allclose(manual_norm, counts_norm))
# True