[英]Map elements to list of unique indexes
假設我有一個元素列表:
my_list = ['CatA', 'CatB', 'CatC', 'CatA', 'CatA', 'CatC']
我想將此列表轉換為唯一元素的索引列表。
因此CatA
被分配到索引0, CatB
被分配到索引1而CatC
被分配到索引2。
我想要的結果是:
result = [0, 1, 2, 0, 0, 2]
目前我這樣做是通過創建一個字典,為每個元素分配它的唯一id
,然后使用列表理解來創建最終的索引列表:
unique_classes = np.unique(my_list)
conversion_dict = dict(unique_classes, range(len(unique_classes))
result = [conversion_dict[i] for i in my_list]
我的問題是:有一種更簡單直接的方法嗎?
我正在考慮有一個很大的類別列表,所以它需要高效,但阻止我手動創建唯一列表,字典和列表理解。
這樣就可以了:
my_list = ['CatA', 'CatB', 'CatC', 'CatA', 'CatA', 'CatC']
first_occurances = dict()
result = []
for i, v in enumerate(my_list):
try:
index = first_occurances[v]
except KeyError:
index = i
first_occurances[v] = i
result.append(index)
復雜性將是O(n) 。
基本上你所做的是存儲在第一個值出現的dict
索引中。 如果first_occurances
沒有值v
,那么我們保存當前索引i
。
正如@mikey所建議的那樣,你可以使用np.unique
,如下所示:
import numpy as np
my_list = ['CatA', 'CatB', 'CatC', 'CatA', 'CatA', 'CatC']
res = np.unique(my_list, return_inverse=True)[1]
結果:
[0 1 2 0 0 2]
您可以使用scikit learn中的標簽編碼器來完成此操作。它會為列表中的每個唯一值分配標簽。
示例代碼:
from sklearn.preprocessing import LabelEncoder
my_list = ['CatA', 'CatB', 'CatC', 'CatA', 'CatA', 'CatC']
le = LabelEncoder()
print(le.fit(my_list).transform(my_list))
result = [my_list.index(l) for l in my_list]
print(result)
[0, 1, 2, 0, 0, 2]
list.index()返回任務所需的第一次出現的索引。
有關更多詳細信息,請檢查list.index()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.