从字符串中提取整数
Extract integers from strings
我想为一个聚类问题创建目标列表,其中 class 个来自我数据集每个实例的 class 个名称(标签)的列表。
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列表长度相同的数组,其中一个整数分配给不同的class标签。获得这个的投注方式是什么?
target = np.array([1, 2, 3, 3, 1, 2, 2, 1, 1, 2, 1, 3])
class 标签(例如 class_1)的格式为 'Xx_xx_xxx(A123)' 或 'Xx_xx_xxx (A123)'。括号中的文字不固定。列表类型为'unicode'。
您可以对 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])
您应该做的第一件事是获取标准格式的 classes。根据您上面的描述,如果 classname 在字符串的括号中,那么您可以使用正则表达式来获取 classname.
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 工具,包括编码 class 个名字。
使用 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 工具。
我想为一个聚类问题创建目标列表,其中 class 个来自我数据集每个实例的 class 个名称(标签)的列表。
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列表长度相同的数组,其中一个整数分配给不同的class标签。获得这个的投注方式是什么?
target = np.array([1, 2, 3, 3, 1, 2, 2, 1, 1, 2, 1, 3])
class 标签(例如 class_1)的格式为 'Xx_xx_xxx(A123)' 或 'Xx_xx_xxx (A123)'。括号中的文字不固定。列表类型为'unicode'。
您可以对 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])
您应该做的第一件事是获取标准格式的 classes。根据您上面的描述,如果 classname 在字符串的括号中,那么您可以使用正则表达式来获取 classname.
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 工具,包括编码 class 个名字。
使用 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 工具。