2016-02-13 143 views
1

我想创建一个聚类问题的目标列表,其中包含我的数据集每个实例上的类名(标签)列表中的大量类。从字符串中提取整数

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'

+1

呃,什么?所以类名有另一种格式比你的例子中的字符串?请提供一个完整的例子,其中包含实际有效的类名,以便我们可以调整我们的答案。 – timgeb

回答

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 stack做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工具。

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])