2016-12-14 96 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實數)。