Numpy 改变范围会导致分布不正常

Numpy 改变范围会导致分布不正常,numpy,Numpy,给出了绘制此图的一些代码 import scipy.stats as ss import numpy as np import matplotlib.pyplot as plt x = np.arange(-10, 11) xU, xL = x + 0.5, x - 0.5 prob = ss.norm.cdf(xU, scale = 3) - ss.norm.cdf(xL, scale = 3) prob = prob / prob.sum() #normalize the probabi

给出了绘制此图的一些代码

import scipy.stats as ss
import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-10, 11)
xU, xL = x + 0.5, x - 0.5 
prob = ss.norm.cdf(xU, scale = 3) - ss.norm.cdf(xL, scale = 3)
prob = prob / prob.sum() #normalize the probabilities so their sum is 1
nums = np.random.choice(x, size = 10000, p = prob)
plt.hist(nums, bins = len(x))

我修改了这条线

x = np.arange(-10, 11)
x = np.arange(10, 31)
这条线

x = np.arange(-10, 11)
x = np.arange(10, 31)
我有这个数字

import scipy.stats as ss
import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-10, 11)
xU, xL = x + 0.5, x - 0.5 
prob = ss.norm.cdf(xU, scale = 3) - ss.norm.cdf(xL, scale = 3)
prob = prob / prob.sum() #normalize the probabilities so their sum is 1
nums = np.random.choice(x, size = 10000, p = prob)
plt.hist(nums, bins = len(x))


如何解决这个问题?

考虑到您要求Python做的事情,这个图中没有错误:它是一个从正态分布尾部(10到31之间的任意值)开始的10000个样本的直方图,平均值为0,标准偏差为3。由于概率在正常值的尾部急剧下降,10000个概率中没有一个超过17个,这就是为什么你没有得到31的完整范围

如果您只想让绘图的x轴覆盖整个预期范围,可以在
plt.hist
之后添加
plt.xlim(9.5,31.5)

如果您想要在整个范围内支持直方图,则需要调整分布的平均值和/或方差。例如,如果在获取
prob
时指定正态分布的平均值为20而不是0,即

prob = ss.norm.cdf(xU, loc=20, scale=3) - ss.norm.cdf(xL, loc=20, scale=3)

然后,您将恢复一个类似的直方图,只是向右平移20。

鉴于您要求Python所做的,此图中没有错误:它是一个从正态分布尾部(四舍五入到10和31之间的任何值)开始的10000个样本的直方图,平均值为0,标准偏差为3。由于概率在正常值的尾部急剧下降,10000个概率中没有一个超过17个,这就是为什么你没有得到31的完整范围

如果您只想让绘图的x轴覆盖整个预期范围,可以在
plt.hist
之后添加
plt.xlim(9.5,31.5)

如果您想要在整个范围内支持直方图,则需要调整分布的平均值和/或方差。例如,如果在获取
prob
时指定正态分布的平均值为20而不是0,即

prob = ss.norm.cdf(xU, loc=20, scale=3) - ss.norm.cdf(xL, loc=20, scale=3)
然后您将恢复一个类似的直方图,只是向右平移了20