基本上我有这个:
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的速度。我尝试过矢量化,但失败了。有任何想法吗?感谢!!!
答案 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]])