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()
函数,以便它正确处理向量参数,尽管这需要一些工作。