簡體   English   中英

將元素映射到唯一索引列表

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM