如何将两个数据集 X 和 Y 转换为 x 轴/索引相同的直方图,而不是变量 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 的 bin 在这里用于 X,因为 Y 的范围比 X 更宽。
调节检查:
all(bins_numpy == bins2)
>>>True
all(bins_numpy == bins_plt)
>>>True
关于python - 如何对齐两个 numpy 直方图,以便它们共享相同的 bin/索引,并将直方图频率转换为概率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64648202/