2016-02-13 192 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])