gpt4 book ai didi

python - 使用不同的权重创建堆叠的 2D 直方图

转载 作者:太空狗 更新时间:2023-10-30 03:04:02 24 4
gpt4 key购买 nike

假设我想建立粒子数据的直方图,该直方图在某个 bin 范围 nbin 上进行了平滑处理。现在我有 5 个数据集,其中包含不同质量的粒子(每组 x、y 具有不同的质量)。通常,粒子位置的直方图是一个简单的例子(使用 numpy):

heatmap, xedges, yedges = np.histogram2d(x, y, bins=nbin)
extent = [xedges[0], xedges[-1], yedges[0], yedges[-1]]
heatmap = np.flipud(np.rot90(heatmap))
ax.imshow(heatmap, extent=extent)

但是,如果我想添加下一批粒子,它们的质量不同,因此密度也会不同。有没有一种方法可以通过某个常数对直方图进行加权,以便绘制的热图能够真实地表示密度,而不仅仅是粒子总数的分箱?

我知道“权重”是一个特征,但是否只是设置权重 = m_i 的情况,其中 m_i 是每个数据集 1-5 的粒子质量?

最佳答案

weights 参数需要一个与 xy 长度相同的数组。 np.histogram2d。它不会广播一个常量值,因此即使每次调用 np.histogram2d 的质量相同,您仍然必须使用类似

的东西
weights=np.ones_like(x)*mass

现在,如果您使用 bin=nbin,您可能会遇到的一个问题是 bin 边缘、xedgesyedges 可能会根据情况发生变化关于传递给 np.histogram2dxy 的值。如果你天真地把热图加在一起,最终的结果会在错误的地方累积粒子密度。

因此,如果您想多次调用 np.histogram2d 并将部分热图添加到一起,您必须提前确定您想要 bin 边缘的位置。

例如:

import numpy as np
import itertools as IT
import matplotlib.pyplot as plt
N = 50
nbin = 10

xs = [np.array([i,i,i+1,i+1]) for i in range(N)]
ys = [np.array([i,i+1,i,i+1]) for i in range(N)]
masses = np.arange(N)

heatmap = 0
xedges = np.linspace(0, N, nbin)
yedges = np.linspace(0, N, nbin)

for x, y, mass in IT.izip(xs, ys, masses):
hist, xedges, yedges = np.histogram2d(
x, y, bins=[xedges, yedges], weights=np.ones_like(x)*mass)
heatmap += hist

extent = [xedges[0], xedges[-1], yedges[0], yedges[-1]]
heatmap = np.flipud(np.rot90(heatmap))
fig, ax = plt.subplots()
ax.imshow(heatmap, extent=extent, interpolation='nearest')
plt.show()

产量

enter image description here

关于python - 使用不同的权重创建堆叠的 2D 直方图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17237000/

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