2016-12-14 114 views
2

有N个分布,它们取整数值0,...以及相关的概率。此外,我假定3个变量[值,概率]:python中的概率函数卷积

import numpy as np 
x = np.array([ [0,0.3],[1,0.2],[3,0.5] ]) 
y = np.array([ [10,0.2],[11,0.4],[13,0.1],[14,0.3] ]) 
z = np.array([ [21,0.3],[23,0.7] ]) 

由于有N个变量余卷积第一X + Y,则我添加Z,等等。 不幸的是,numpy.convole()把一维数组作为输入变量,所以它不适合在这种情况下直接使用。我玩变数,把他们的所有值0,1,2,...,23(如果值不知道,那么Pr = 0)...我觉得还有另一个更好的解决方案。

有没有人有建议让它更有效率?提前致谢。

回答

3

我在Scipy中看不到这种内置方法;有一种方法可以定义一个自定义的离散随机变量,但不支持添加。下面是使用熊猫的方法,假设import pandas as pdx,y,z在你的例子:

values = np.add.outer(x[:,0], y[:,0]).flatten() 
probs = np.multiply.outer(x[:,1], y[:,1]).flatten() 
df = pd.DataFrame({'values': values, 'probs': probs}) 
conv = df.groupby('values').sum() 
result = conv.reset_index().values 

输出是

array([[ 10. , 0.06], 
     [ 11. , 0.16], 
     [ 12. , 0.08], 
     [ 13. , 0.13], 
     [ 14. , 0.31], 
     [ 15. , 0.06], 
     [ 16. , 0.05], 
     [ 17. , 0.15]]) 

拥有两个以上的变量,你不必去来回之间numpy和熊猫:在开始时可以包含附加变量。

values = np.add.outer(np.add.outer(x[:,0], y[:,0]), z[:,0]).flatten() 
probs = np.multiply.outer(np.multiply.outer(x[:,1], y[:,1]), z[:,1]).flatten() 

旁白:这将是更好地保持在单独numpy的数组值和概率,如果他们有不同的内部数据类型(整数VS实数)。