从字符串

时间:2016-02-13 00:04:27

标签: python label

我想为我的数据集的每个实例中的类名(标签)列表中的众多类创建聚类问题的目标列表。

class_name = ['class_1','class_2','class_3','class_3','class_1','class_2',\
'class_2','class_1','class_1','class_2','class_1','class_3'] 

目标列表应该类似于与class_name列表长度相同的数组,其中整数分配给不同的类标签。这是下注的方法吗?

target = np.array([1, 2, 3, 3, 1, 2, 2, 1, 1, 2, 1, 3])

类别标签(例如class_1)的格式为' Xx_xx_xxx(A123)'或者' Xx_xx_xxx(A123)'。括号中的文本不固定。列表类型是' unicode'

2 个答案:

答案 0 :(得分:1)

您可以使用列表理解split '_'字符上的字符串,取索引[1]处的数字,然后转换为int

>>> target = np.array([int(i.split('_')[1]) for i in class_name])
>>> target
array([1, 2, 3, 3, 1, 2, 2, 1, 1, 2, 1, 3])

答案 1 :(得分:1)

您应该做的第一件事是以标准格式获取类。根据您的描述,如果类名在字符串中的parens中,那么您可以使用正则表达式来获取类名。

import re
X = ['abc(class_1)', 'cde_(class_1)', 'def_(class_2)']
just_classes = [re.findall(r'\((.*)\)', thing)[0] for thing in X]
# ['class_1', 'class_1', 'class_2']

您可以在此处使用几种不同的方法。如果你正在使用numpy,scipy堆栈做ml,我建议学习sklearn库。它有很多有用的机器学习和AI工具,包括编码类名。

使用sklearn

from sklearn.preprocessing import LabelEncoder
class_names = ['class_1','class_2','class_3','class_3','class_1','class_2',\
        'class_2','class_1','class_1','class_2','class_1','class_3'] 

my_enc = LabelEncoder()
my_enc.fit(class_names)
encoded1 =  my_enc.transform(class_names)

没有外部库

classes = set(class_names)
d = {c:i for i,c in enumerate(classes)}
encoded2 = [d[c_name] for c_name in class_names]
print encoded1 #approach 1 gives numpy array
print encoded2 # approach 2 gives standard python list

这两种方法都应该有效。你自己实现的代码并不多,但总的来说,我建议你看一下sklearn preprocessing工具。