首页 > 解决方案 > 创建具有不同平均值的正态分布列

问题描述

我有以下 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), ...]]

如何创建最终矩阵?

标签: pythonnumpyscipy

解决方案


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)

推荐阅读