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

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”。

最佳答案

您应该做的第一件事是以标准格式获取类。根据上面的描述,如果类名位于字符串中的括号内,则可以使用正则表达式获取类名。

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

关于python - 从字符串中提取整数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35374323/

10-12 16:47