我试图用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
这是pythonic吗?
有没有办法传递参数和输入,并得到一个矩阵,其中包含更多pythonic / vectorized /更快的所有组合?
!重要提示:示例中的输入是标量值(我设置标量值以简化问题描述,我实际上使用的是n维向量数组,因此多变量 _normal pdf)。
欢迎提供有关类似操作的提示和提示。
答案 0 :(得分:1)
根据您对计算内容的描述,您不需要multivariate_normal
。您正在使用一组带有标量mu和sigma的分布的标量值来调用PDF方法。因此,您可以使用scipy.stats.norm
的pdf()
方法。此方法将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