如何使用numpy以pythonic方式实现一对多方法
我有一系列的标签,让它成为[a,a,b,b,c,c] 我需要实现一对所有方法-返回带标签的numpy数组的数量,等于二进制表示中唯一类的数量,因此: a类->如何使用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 = [
[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)
缩进好像不对劲了,你能看一下代码吗?希望现在可以了