【发布时间】:2021-03-16 22:58:16
【问题描述】:
我正在尝试为我拥有的一些数据创建一个 3D 直方图,但我认为我定义 bin 的方式一定有问题,因为我得到了很多空的边缘直方图。以下是我如何创建直方图以及如何检查值--
# Hard boundaries for the cube
param1_range = [0, 6]
param2_range = [-2, +0.5]
param3_range = [0, 2]
d_param1 = 0.5
param1_bins = np.arange(param1_range[0], param1_range[1], d_param1)
N_param1_bins = len(d_param1) - 1
d_param2 = 0.5
param2_bins = np.arange(param2_range[0], param2_range[1], d_param2)
N_param2_bins = len(d_param2) - 1
d_param3 = 0.25
param3_bins = np.arange(param3_range[0], param3_range[1], d_param3)
N_param3_bins = len(d_param3) - 1
empty_param1, empty_param2, empty_param3 = 0, 0, 0
cube_full = np.zeros((Nobs, N_param1_bins, N_param2_bins, N_param3_bins))
for i in range(Nobs):
tmp = np.vstack((param1_data[i,:], param2_data[i,:], param3_data[i,:])).T
hist, _ = np.histogramdd(tmp[:,:],
bins=[param1_bins, param2_bins, param3_bins],
density=True)
cube_full[i,:,:,:] = hist
if np.all(hist[:,0,0] == 0.):
empty_param1 = empty_param1 + 1
if np.all(hist[0,:,0] == 0.):
empty_param2 = empty_param2 + 1
if np.all(hist[0,0,:] == 0.):
empty_param3 = empty_param3 + 1
print(empty_param1/Nobs, empty_param2/Nobs, empty_param3/Nobs)
“param1”的边缘直方图大约有一半是空的,“param2”和“param3”几乎都是空的。
我通过查看数据确定了参数范围。我还使用这些相同的范围为不同的参数创建了 1D 直方图,并且不会像我尝试制作 3D 直方图时那样得到空箱。在定义 3D bin 与 1D bin 时,是否还有一些我遗漏的额外注意事项?
【问题讨论】:
-
您说的是“边际直方图”,第一个
np.all询问“param2 -
您介意解释一下第一个 np.all 选择 param2
-
hist[:,0:0]将包含 Y 和 Z 坐标进入第零个 bin 的所有点。 Y 的第零个 bin 是 -2 到 -1.5,Z 的第零个 bin 是 0 到 0.25。如果没有 -2 -
hist[0,0,0]包含 X hist[1,0,0] 包含 0.5 -
好的,谢谢你的解释。我一定是误解了“hist”的数据结构。我要做的是选择沿不同轴的一维直方图(我的意思是“边际”)。你有什么建议吗?而且,只是为了检查,我试图用 histogramdd 做的是使用 param123_ranges 定义 3D 箱并获得网格点上的幅度。这是 histogramdd 实际上在做什么?
标签: python numpy multidimensional-array histogram