python - 如何对齐两个 numpy 直方图,以便它们共享相同的 bin/索引,并将直方图频率转换为概率?

标签 python numpy histogram binning histogram2d

如何将两个数据集 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()

enter image description here

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

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()

enter image description here

请注意此处使用 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/

相关文章:

python - 匹配两个节点并保持其他各自节点之间的路径 networkx

python - 使用 numpy 读取一个两列的 csv 文件

python - scipy.optimize.leastsq 使用 NaN 调用目标函数

OPTICS(聚类)算法的 Python 实现

python - 循环中奇怪的 lambda 行为

Python - 有一个 pcolor 图;现在想要一个表面

python - 列表中列表的直方图

r - 尝试在 R 中创建直方图时 x 必须是数字

graph - 如何减少直方图 gnuplot 中的间隙?

python 2 : How can I edit each part of my set object?