创建具有不同平均值的正态分布列

时间:2019-03-07 18:55:26

标签: python numpy scipy

我有以下numpy矩阵:

R = np.matrix(np.ones([3,3]))

# Update R matrix based on sales statistics
for i in range(0, len(R)):
    for j in range(0, len(R)):  
        R[j,i] = scipy.stats.norm(2, 1).pdf(i) * 100  

print(R)

[[ 5.39909665 24.19707245 39.89422804]
 [ 5.39909665 24.19707245 39.89422804]
 [ 5.39909665 24.19707245 39.89422804]]

我想将每一个列转换为与索引值(0,1,2)相乘的 到相应的普通的密度值分布,第一列的平均值分别等于5.39909665,第二列的平均值为24.19707245,第三列的平均值为39.8942280;标准偏差等于1。

最终,将矩阵创建为:

[norm(5.39, 1).pdf(0), norm(24.197, 1).pdf(0), ...]
     [ norm(5.39, 1).pdf(1), norm(24.197, 1).pdf(1), ...]
     [ norm(5.39, 1).pdf(2), norm(24.197, 1).pdf(2), ...]]

如何创建最终矩阵?

1 个答案:

答案 0 :(得分:1)

pdf方法与任何numpy函数的工作方式非常相似,从某种意义上说,您可以将具有相同形状的数组与标量组合使用。您可以使用以下内容创建R:

ix = np.repeat(np.arange(3),3).reshape((3,3)) #row index, or ix.T for column index
R = scipy.stats.norm(2,1).pdf(ix.T)*100
>>array([[ 5.39909665, 24.19707245, 39.89422804],
   [ 5.39909665, 24.19707245, 39.89422804],
   [ 5.39909665, 24.19707245, 39.89422804]])

按照相同的逻辑,如果您希望[i,j]索引为scipy.stats.norm(scipy.stats.norm(2,1).pdf(j) * 100, 1).pdf(i)(从结果矩阵中得出),请使用:

scipy.stats.norm(scipy.stats.norm(2,1).pdf(ix.T) * 100, 1).pdf(ix)