计算numpy数组列的唯一值概率

刘易斯·莫里斯

我想从预测列表中创建一个scikit-learns Forecast_proba版本。

我目前有一个看起来像这样的列表:

[[0,1,0,0,0,1,1,0,0,0],[0,1,0,1,0,1,1,1,0,0],[0,0,0,0,0,1,1,0,0,0]]

我想找到每个列表的第一个值是0或1的概率,然后对于每个连续值都相同。

即输出将是这样的:

[[0.33,0.66],[0,1],[0.66,0.3]........etc 

我已经写了下面的代码,它可以正常工作,但是似乎很笨拙,我确定有更好的方法可以实现我的目标吗?

有什么建议吗?

#create np array from list 
ar = np.array([[0,1,0,0,0,1,1,0,0,0],[0,1,0,1,0,1,1,1,0,0],[0,0,0,0,0,1,1,0,0,0]])

#calculate unique values and sort in order
uni = np.unique(ar)
uni.sort()

#create new pred list
new_pred = []

#transpose and iterate
for row in ar.transpose():
    # create dic with keys as unique values
    val_dic = {k: 0 for k in uni}    

    #create list for row probabilities
    row_pred = []

    #iterate row and incremnet dic if found
    for val in row:
        if val in val_dic.keys():
            val_dic[val] = val_dic.get(val, 0) + 1

    #calc row total 
    total = sum(val_dic.values())

    #append row list with probabilities
    for val in val_dic.values():
        row_pred.append(val/total)       

    #append final output list
    new_pred.append(row_pred)

print(new_pred)

输出:

[[1.0, 0.0], [0.3333333333333333, 0.6666666666666666], [1.0, 0.0], [0.6666666666666666, 0.3333333333333333], [1.0, 0.0], [0.0, 1.0], [0.0, 1.0], [0.6666666666666666, 0.3333333333333333], [1.0, 0.0], [1.0, 0.0]]
安德烈·凯斯利(Andrej Kesely)

如果您ar是由唯一的01因为你的问题,你可以做到这一点,以简化你的代码:

import numpy as np

ar = np.array([[0,1,0,0,0,1,1,0,0,0],[0,1,0,1,0,1,1,1,0,0],[0,0,0,0,0,1,1,0,0,0]])

prob_1 = ar.T.sum(axis=1) / len(ar)          # <-- max sum of row is len(ar) == 3
prob_0 = 1.0 - prob_1
print(np.column_stack((prob_0, prob_1)))

印刷品:

[[1.         0.        ]
 [0.33333333 0.66666667]
 [1.         0.        ]
 [0.66666667 0.33333333]
 [1.         0.        ]
 [0.         1.        ]
 [0.         1.        ]
 [0.66666667 0.33333333]
 [1.         0.        ]
 [1.         0.        ]]

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章