我有一系列标签,让它成为[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
)
答案 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)