Python 在scipy.stats.rv_上调用'rvs'或'pdf'时作为参数的数组
我正在使用Python 在scipy.stats.rv_上调用'rvs'或'pdf'时作为参数的数组,python,numpy,scipy,Python,Numpy,Scipy,我正在使用scipy.stats.rv_continuous从自定义分布创建一个随机变量。我的发行版有许多参数,我可能想对其进行调整,并且参数的数量不一定需要保持固定。以下是目前的情况: class Test_gen(rv_continuous): v = np.array([0.0, 0.1, 0.1]) def _pdf(self, x): return 1.0/2/np.pi * (1 + np.sum(2 * self.v * np.cos(x)))
scipy.stats.rv_continuous
从自定义分布创建一个随机变量。我的发行版有许多参数,我可能想对其进行调整,并且参数的数量不一定需要保持固定。以下是目前的情况:
class Test_gen(rv_continuous):
v = np.array([0.0, 0.1, 0.1])
def _pdf(self, x):
return 1.0/2/np.pi * (1 + np.sum(2 * self.v * np.cos(x)))
test = Test_gen(name='test', a=0, b=2*np.pi)
np.random.seed(42)
test.pdf(0)
>>> 0.22281692032865347
正如您所看到的,我正在使用v
数组中的所有值来生成一个随机变量—正如预期的那样。我现在试图在调用test.pdf
时将v
向量作为形状参数传递。据我所知,我只想在\u pdf
函数中添加一个v
参数。然而,由于v
是一个向量,因此scipy认为我想对调用进行向量化,一次生成几个随机变量。因此,它试图传播我给出的论点,并产生一个我无法完全理解其来源的结果。以下是一个不起作用的示例:
class Test_gen(rv_continuous):
def _pdf(self, x, v):
print "Got `v` as: ", v
return 1.0/2/np.pi * (1 + np.sum(2 * v * np.cos((x ))))
test = Test_gen(name='test', a=0, b=2*np.pi)
np.random.seed(42)
test.pdf(0, v=np.array([0, 0.1, 0.1]))
>>> Got `v` as: [ 0.1 0.1]
>>> array([ nan, 0.22281692, 0.22281692])
我希望后一个示例会像第一个示例一样生成0.22281692032865347
(作为标量)。如果我想将向量全部消耗以产生单个变量,如何使用向量作为参数?看起来pdf()
方法的rv_continuous
假设所有参数都是标量,应该一起广播(参见代码)。不幸的是,我不知道如何允许向量参数。最简单的方法可能是重写pdf()
函数,以便它正确处理向量参数,尽管这需要一些工作。