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