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将变得异常庞大。所以我看不出这是如何以简洁的方式插入的。但是,欢迎您使用我所写的任何部分,您希望包括在其中。