如何使用参数作为矩阵调用函数?

时间:2016-01-07 02:08:14

标签: python numpy scipy probability probability-density

我试图用mu和sigma的四个不同参数调用scipy.stats.multivariate_normal。然后对于每个生成的概率密度函数,我需要将这个pdf称为10个值的数组。

为简单起见,我们说上面提到的函数是addXY

def addXY(x, y):
    return x+y

params=[[1,2],[1,3],[1,4],[1,5]]       # mu and sigma, four versions
inputs=[1,2,3]                         # values, in this case 3 of them

matrix = []
for pdf_params in params:
    row = []
    for inp in inputs:
        entry = addXY(*pdf_params) 
        row.append(entry*inp)
    matrix.append(row)
print matrix
  1. 这是pythonic吗?

  2. 有没有办法传递参数和输入,并得到一个矩阵,其中包含更多pythonic / vectorized /更快的所有组合?

  3. !重要提示:示例中的输入是标量值(我设置标量值以简化问题描述,我实际上使用的是n维向量数组,因此多变量 _normal pdf)。

    欢迎提供有关类似操作的提示和提示。

2 个答案:

答案 0 :(得分:1)

根据您对计算内容的描述,您不需要multivariate_normal。您正在使用一组带有标量mu和sigma的分布的标量值来调用PDF方法。因此,您可以使用scipy.stats.normpdf()方法。此方法将broadcast其参数,因此通过传入具有适当形状的数组,您可以在一次调用中计算不同mu和sigma值的PDF。这是一个例子。

以下是您的x值(您称之为inputs)和参数:

In [23]: x = np.array([1, 2, 3])

In [24]: params = np.array([[1, 2], [1, 3], [1, 4], [1, 5]])

为方便起见,将参数分为mu和sigma值数组。

In [25]: mu = params[:, 0]

In [26]: sig = params[:, 1]

我们会使用scipy.stats.norm来计算PDF。

In [27]: from scipy.stats import norm

此调用计算所需x和参数组合的PDF。 mu.reshape(-1, 1)sig.reshape(-1, 1)是具有形状(4,1)的2D数组。 x具有形状(3,),因此当广播这些参数时,结果具有形状(4,3)。每行都是x评估的一对mu和sigma对的PDF。

In [28]: p = norm.pdf(x, loc=mu.reshape(-1, 1), scale=sig.reshape(-1, 1))

In [29]: p
Out[29]: 
array([[ 0.19947114,  0.17603266,  0.12098536],
       [ 0.13298076,  0.12579441,  0.10648267],
       [ 0.09973557,  0.09666703,  0.08801633],
       [ 0.07978846,  0.07820854,  0.07365403]])

换句话说,p的行是:

norm.pdf(x, loc=mu[0], scale=sig[0])
norm.pdf(x, loc=mu[1], scale=sig[1])
norm.pdf(x, loc=mu[2], scale=sig[2])
norm.pdf(x, loc=mu[3], scale=sig[3])

答案 1 :(得分:0)

这只是我的想法,缩短代码并使用更多的库。

在您的代码中,事实上,您不使用numpy,scipy。问题是你是否想使用numpy.array进行进一步的数据处理。

选项1:只使用list来显示列表和列表列表:

from itertools import product
matrix_list = [sum(param)*input_x for param, input_x in product(params, inputs)]
matrix = zip(*[iter(matrix_list)]*len(inputs))
print matrix

应该给予使用zip方法的信用 convert a flat list to list of list in python

选项2:使用numpy.array和numpy.matrix进行进一步处理

from itertools import product
import numpy as np
matrix_array = np.array([sum(param)*input_x for param, input_x in      product(params, inputs)])
matrix = matrix_array.reshape(len(params),len(inputs))
print matrix