按区域

时间:2015-10-18 15:58:04

标签: python arrays numpy matplotlib

我有一个我用numpy生成的2D直方图:

H, xedges, yedges = np.histogram2d(y, x, weights=mass * (1.0 - pf),
                                   bins=(yrange,xrange))

请注意,我目前正在使用质量函数来衡量分档(mass是一个与xy具有相同尺寸的numpy数组。这些箱子是对数的(通过xrange = np.logspace(minX, maxX, 100)生成)。

然而,我真的想通过质量函数对容器进行加权,但是将它们归一化(即除以)每个区域的区域:例如 - 每个垃圾箱都有区域xrange[i] * yrange[i]。但是,由于xrangeyrangemassxy具有相同的维度,因此我无法做到只需将规范化置于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)))

Phase diagram relating star particle metals to the fraction of primordial metals

1 个答案:

答案 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