Python 在Scipy中,为什么具有统一概率的custom.rvs()只返回起始区域中的值?

Python 在Scipy中,为什么具有统一概率的custom.rvs()只返回起始区域中的值?,python,numpy,scipy,scikit-learn,probability,Python,Numpy,Scipy,Scikit Learn,Probability,如果我生成一个数组 custom=np.ones(800, dtype=np.float32) 然后使用 custom=normalize(custom)[0] customPDF = stats.rv_discrete(name='pdfX', values=(np.arange(800), custom)) 那么如果我使用 customPDF.rvs() 我得到的返回值范围为0-20,而我期望随机数从0到800不等 下面的代码提供了所需的输出 random.uniform(0,800)

如果我生成一个数组

custom=np.ones(800, dtype=np.float32)
然后使用

custom=normalize(custom)[0]
customPDF = stats.rv_discrete(name='pdfX', values=(np.arange(800), custom))
那么如果我使用

customPDF.rvs()
我得到的返回值范围为0-20,而我期望随机数从0到800不等

下面的代码提供了所需的输出

random.uniform(0,800) 
但是由于必须能够通过改变自定义数组来操纵概率分布,我不得不使用customPDF.rvs()

有没有解决办法或者为什么会发生这种情况



问题在于这一行:

custom=normalize(custom)[0]
根据警告,它看起来像是
normalize
所指<代码>规格化需要一个
[n_样本,n_特征]
二维数组-由于您给它一个1D向量,它将插入一个新维度,并将其视为
[1,n_特征]
数组(因此您要为输出的第0个元素编制索引)

默认情况下,它会将每行要素的长度调整为1。这与将元素总和设为1不同:

print(normalize(np.ones(800))[0].sum())
# 28.2843
由于
custom
的和远大于1,因此在概率向量结束之前,绘制特定整数的累积概率达到1:

print(custom.cumsum().searchsorted(1))
# 28
其结果是,您永远不会绘制大于28的整数:

print(customPDF.rvs(size=100000).max())
# 28
为了规范化
自定义
您应该做的是除以其总和:

custom /= custom.sum()

# or alternatively:
custom = np.repeat(1./800, 800)

问题在于这一行:

custom=normalize(custom)[0]
根据警告,它看起来像是
normalize
所指<代码>规格化需要一个
[n_样本,n_特征]
二维数组-由于您给它一个1D向量,它将插入一个新维度,并将其视为
[1,n_特征]
数组(因此您要为输出的第0个元素编制索引)

默认情况下,它会将每行要素的长度调整为1。这与将元素总和设为1不同:

print(normalize(np.ones(800))[0].sum())
# 28.2843
由于
custom
的和远大于1,因此在概率向量结束之前,绘制特定整数的累积概率达到1:

print(custom.cumsum().searchsorted(1))
# 28
其结果是,您永远不会绘制大于28的整数:

print(customPDF.rvs(size=100000).max())
# 28
为了规范化
自定义
您应该做的是除以其总和:

custom /= custom.sum()

# or alternatively:
custom = np.repeat(1./800, 800)

请添加您的导入。您正在使用几个不知从何而来的函数。请添加您的导入。您正在使用一些不知从何而来的函数。