我想知道以下方法是否可以做得更好:
import numpy as np
def label_items(items):
data = np.array(items)
labels = np.zeros(len(items), dtype='int')
for label, value in enumerate(set(items)):
labels[data==value] = label
return labels
例如:
label_items(['a', 'a', 'c', 'd', 'e', 'b', 'e', 'e', 'd', 'c'])
将返回
array([0, 0, 1, 4, 3, 2, 3, 3, 4, 1])
附录:字母仅是示例,可以是任何内容的列表。这就是为什么我将函数称为“ label_items”。标签的顺序无关紧要。
答案 0 :(得分:4)
您可以使用简单的map
:
list(map(lambda x: ord(x) - ord('a'), a))
结果:
[0, 0, 2, 3, 4, 1, 4, 4, 3, 2]
因此,ord
函数返回一个整数,表示该字符的Unicode代码点。比ord(x) - ord('a')
(其中x
-一些字母)返回字母顺序编号。
答案 1 :(得分:4)
如果顺序不重要,则可以使用numpy.unique
:
import numpy as np
def label_items(arr):
return np.unique(arr, return_inverse=True)
vals, labels = label_items(['a', 'a', 'c', 'd', 'e', 'b', 'e', 'e', 'd', 'c'])
print(vals)
['a' 'b' 'c' 'd' 'e']
print(labels)
[0 0 2 3 4 1 4 4 3 2]