有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)......我觉得还有另一个更好的解决方案。
是否有人建议提高效率?提前谢谢。
答案 0 :(得分:3)
我没有在Scipy看到内置的方法;有一种定义自定义离散随机变量的方法,但那些不支持添加。以下是使用pandas的方法,假设import pandas as pd
和x,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数组中会更好。