我有一个带有两个独立离散变量的高斯函数。如何创建包含所有可能值的矩阵?

时间:2016-02-08 23:24:38

标签: python numpy pandas scipy

基本上我有这个:

from scip.stats import norm
import pandas as pd

r = pd.Series([1, 2, 3])
k = pd.Series([0.2, 0.3, 0.4, 0.5])
x = 2

mean = x + k
variance = k

# I'm feeding the gaussian function two vectors. 
# I'd like to get a matrix back of all possible combinations. Quickly.

values = norm.pdf(r, mean, variance)

所以我给norm.pdf函数提供了两个数据向量,我想要一个(3x4)矩阵返回给我看起来像:

values(1, 0.2)    values(1, 0.3)    values(1, 0.4)    values(1, 0.5)
values(2, 0.2)                                             ...
values(3, 0.2)                                             ...
values(4, 0.2)     ...........       ...........      values(4, 0.5)

我知道我可以迭代所有数组中的所有项目,但这需要花费很多时间,而且我计划对其进行相当大的扩展。我想利用numpy的速度。我尝试过矢量化,但失败了。有任何想法吗?感谢!!!

2 个答案:

答案 0 :(得分:2)

您可以将pdf应用于r的每个元素,并使用以下内容自动将结果放入矩阵中:

r.apply(lambda x: pd.Series(norm.pdf(x, mean, variance), index=k))

如果您从Series返回apply,则结果会自动解压缩到列中。输出:

            0.2       0.3       0.4       0.5
0  3.037941e-08  0.000111  0.002182  0.008864
1  1.209854e+00  0.806569  0.604927  0.483941
2  6.691511e-04  0.087406  0.323794  0.483941

答案 1 :(得分:1)

使用numpy.meshgrid获取所有输入组合:

all_r,all_means =  np.meshgrid(r,mean)
_,all_variances = np.meshgrid(r,variance)
values = norm.pdf(all_r, all_means, all_variances)

这将返回二维网格中的值:

print values
# outputs 
array([[  3.03794142e-08,   1.20985362e+00,   6.69151129e-04],
       [  1.11236208e-04,   8.06569082e-01,   8.74062970e-02],
       [  2.18170674e-03,   6.04926811e-01,   3.23793989e-01],
       [  8.86369682e-03,   4.83941449e-01,   4.83941449e-01]])