如何对齐两个 numpy 直方图,使它们共享相同的 bins/index,并将直方图频率转换为概率?

How to align two numpy histograms so that they share the same bins/index, and also transform histogram frequencies to probabilities?

如何将两个数据集 X 和 Y 转换为 x-axes/index 相同的直方图,而不是变量 X 的 x 轴范围共同低于或高于变量 Y 的 x 轴范围(如下面的代码是如何生成的)?我希望 numpy 直方图输出值准备好在之后绘制在共享直方图中。

import numpy as np
from numpy.random import randn

n = 100  # number of bins

#datasets
X = randn(n)*.1
Y = randn(n)*.2

#empirical distributions
a = np.histogram(X,bins=n)
b = np.histogram(Y,bins=n)

如果您的目标只是将两者(或更多)结合在一起,则无需使用 np.histogram。 Matplotlib 可以做到这一点。

import matplotlib.pyplot as plt

plt.hist([X, Y])  # using your X & Y from question
plt.show()

如果您想要概率而不是直方图中的计数,请添加权重:

wx = np.ones_like(X) / len(X)
wy = np.ones_like(Y) / len(Y)

您还可以从 plt.hist 获取输出以用于其他用途。

n_plt, bins_plt, patches = plt.hist([X, Y], bins=n-1, weights=[wx,wy])  
plt.show()

注意这里使用 n-1 而不是 n 因为 numpy 和 matplotlib 添加了一个额外的 bin。您可以根据您的用例使用 n

但是,如果您真的想要这些 bin 用于其他目的,np.historgram 会给出输出中使用的 bin——您可以将其用作第二个直方图中的输入:

a,bins_numpy = np.histogram(Y,bins=n-1)
b,bins2 = np.histogram(X,bins=bins_numpy)

这里 Y 的 bins 用于 X,因为你的 Y 比 X 的范围更广。

对帐检查:

all(bins_numpy == bins2)

>>>True


all(bins_numpy == bins_plt)

>>>True