如何使用numpy以pythonic方式实现一对多方法

如何使用numpy以pythonic方式实现一对多方法,python,arrays,numpy,Python,Arrays,Numpy,我有一系列的标签,让它成为[a,a,b,b,c,c] 我需要实现一对所有方法-返回带标签的numpy数组的数量,等于二进制表示中唯一类的数量,因此: a类->[1,1,0,0,0,0] b类->[0,0,1,1,0,0] c类->[0,0,0,0,1,1] 如果我有两个类标签集,比如[a,b,a,a],我只需要返回一个numpy数组,比如[1,0,1,1]。为此,我制定了下一个职能: def _preproc_labels(labels): class_names = [

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

如果我有两个类标签集,比如
[a,b,a,a]
,我只需要返回一个numpy数组,比如
[1,0,1,1]
。为此,我制定了下一个职能:

    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\u name

您可以通过组合
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)

缩进好像不对劲了,你能看一下代码吗?希望现在可以了