如何用numpy以pythonic方式实现one_vs_all方法

时间:2017-10-07 21:45:54

标签: python arrays numpy

我有一系列标签,让它成为[a,a,b,b,c,c] 我需要实现one-all-all方法 - 返回带有标签的numpy数组的数量,等于二进制表示中唯一类的数量,所以: a类 - > [1,1,0,0,0,0] b级 - > [0,0,1,1,0,0] class c - > [0,0,0,0,1,1]

如果我有两个类别的标签'设置如[a,b,a,a],我只需返回一个像[1,0,1,1]这样的numpy数组。为此,我做了下一个功能:

    def _preproc_labels(labels):
        class_names = [k for k in enumerate(set(labels))]
        if len(class_names)>2:
            one_vs_all_func = np.vectorize(lambda cls_name, x: 1 if 
                                           x==cls_name else 0)
            res = [one_vs_all_func(class_name[1], labels) for 
                                   class_name in class_names]
        elif len(class_names)==2:
            res = copy.deepcopy(labels)
            res[res==class_names[0][1]]=class_names[0][0]
            res[res==class_names[1][1]]=class_names[1][0]
            res = np.array([res])
        else:
            raise Exception('Labels are not valid!')
        return res, np.array(class_names)

然而,我想找到更合适的方法来解决这个问题,因为当前的解决方案看起来并不好看。另外,我需要保存一些指针,以找出具体数字所代表的类的名称(在我的函数中为class_names

1 个答案:

答案 0 :(得分:0)

您可以使用numpy.unique的组合来查找唯一的类和掩码,以查找与给定类匹配的数组中的元素:

labels = np.array(['a','b','a','a','c','b'])
classes = np.unique(labels)
results = {}
for c in classes:
    # the mask will return an array of booleans so convert them to ints
    results[c] = (labels == c).astype(int)