Python 获得scipy';s rv_离散是否可以处理浮点值?

Python 获得scipy';s rv_离散是否可以处理浮点值?,python,numpy,scipy,Python,Numpy,Scipy,我试图定义我自己的离散分布。我的代码适用于整数值,但不适用于十进制值。例如,这项工作: >>> from scipy.stats import rv_discrete >>> probabilities = [0.2, 0.5, 0.3] >>> values = [1, 2, 3] >>> distrib = rv_discrete(values=(values, probabilities)) >>>

我试图定义我自己的离散分布。我的代码适用于整数值,但不适用于十进制值。例如,这项工作:

>>> from scipy.stats import rv_discrete
>>> probabilities = [0.2, 0.5, 0.3]
>>> values = [1, 2, 3]
>>> distrib = rv_discrete(values=(values, probabilities))
>>> print distrib.rvs(size=10)
[1 3 3 2 2 2 2 2 1 3]
但是如果我使用十进制值,它就不起作用了:

>>> from scipy.stats import rv_discrete
>>> probabilities = [0.2, 0.5, 0.3]
>>> values = [.1, .2, .3]
>>> distrib = rv_discrete(values=(values, probabilities))
>>> print distrib.rvs(size=10)
[0 0 0 0 0 0 0 0 0 0]
谢谢..

每:

值:两个类似数组的元组,可选
(xk,pk)
其中
xk
是非零整数 概率
pk
sum(pk)=1

(我的重点)。因此,
rv_discrete
创建的离散分布必须使用整数值。但是,通过使用rvs值作为整数索引,将这些整数值映射到浮点值并不是难事

In [4]: values = np.array([0.1, 0.2, 0.3])

In [5]: idx = distrib.rvs(size=10); idx
Out[5]: array([1, 1, 0, 0, 1, 1, 0, 2, 1, 1])

In [6]: values[idx]
Out[6]: array([ 0.2,  0.2,  0.1,  0.1,  0.2,  0.2,  0.1,  0.3,  0.2,  0.2])

因此,您可以使用:

import numpy as np
import scipy.stats as stats
np.random.seed(2016)
probabilities = np.array([0.2, 0.5, 0.3])
values = np.array([0.1, 0.2, 0.3])
distrib = stats.rv_discrete(values=(range(len(probabilities)), probabilities))
idx = distrib.rvs(size=10)
result = values[idx]
print(result)
# [ 0.3  0.3  0.3  0.3  0.2  0.2  0.2  0.3  0.3  0.2]

这应该会进入scipy文档。有兴趣发送请求@unutbu吗?(另见)@ev br:我认为,如果scipy不假定与numpy合作,scipy docs将变得异常庞大。所以我看不出这是如何以简洁的方式插入的。但是,欢迎您使用我所写的任何部分,您希望包括在其中。