概率函数在python中进行卷积

时间:2016-12-14 09:32:34

标签: python numpy scipy

有N个分布采用整数值0,...与相关概率。此外,我假设3个变量[value,prob]:

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()将1-d数组作为输入变量,因此在这种情况下不直接适用。我使用变量来获取所有值0,1,2,...,23(如果值不知道那么Pr = 0)......我觉得还有另一个更好的解决方案。

是否有人建议提高效率?提前谢谢。

1 个答案:

答案 0 :(得分:3)

我没有在Scipy看到内置的方法;有一种定义自定义离散随机变量的方法,但那些不支持添加。以下是使用pandas的方法,假设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和pandas之间来回转换:其他变量可以包含在开头。

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数组中会更好。