如何使用Numpy将字符串标签向量转换为索引化向量?
使用NumPy将字符串向量转换为索引化向量
当然可以用NumPy实现这个需求!而且刚好能利用你提到的np.unique()函数来完成,这也是处理分类标签(比如鸢尾花数据集的品种标签)的常用方案。
方法一:直接用np.unique()的return_inverse参数
np.unique()有一个非常实用的参数return_inverse,当设置为True时,它会返回原始数组中每个元素在唯一值数组中的索引,完全符合你要的转换效果。
示例代码:
import numpy as np # 你的示例字符串数组 str_array = np.array(['ABC', 'DEF', 'GHI', 'DEF', 'ABC']) # 获取唯一值数组,以及原始数组对应的索引 unique_labels, index_array = np.unique(str_array, return_inverse=True) print(index_array) # 输出: [0 1 2 1 0] print(unique_labels) # 输出: ['ABC' 'DEF' 'GHI']
这里unique_labels是排序后的唯一字符串集合,index_array就是你需要的整数索引数组。对于鸢尾花数据集的标签(比如['setosa', 'versicolor', 'virginica']),这种方法完全适用——不管标签的排序顺序如何,只要索引和标签一一对应,后续的模型训练或分析都不会受影响。
方法二:保持标签首次出现的顺序
如果你的需求是按标签第一次出现的顺序分配索引(而不是默认的排序后顺序),可以结合np.unique()的return_index参数来实现:
示例代码:
import numpy as np str_array = np.array(['DEF', 'ABC', 'DEF', 'GHI']) # 获取唯一值数组,以及每个唯一值在原始数组中第一次出现的索引 unique_vals, first_indices = np.unique(str_array, return_index=True) # 按第一次出现的顺序重新排序唯一值 ordered_unique_vals = unique_vals[np.argsort(first_indices)] # 创建标签到索引的映射字典 label_to_idx = {label: idx for idx, label in enumerate(ordered_unique_vals)} # 转换原始数组为索引数组 index_array = np.array([label_to_idx[label] for label in str_array]) print(index_array) # 输出: [0 1 0 2] print(ordered_unique_vals) # 输出: ['DEF' 'ABC' 'GHI']
和Pandas方法的对比
你提到Pandas的Series.astype('category').cat.codes可以实现类似功能,NumPy的方法优势在于不需要依赖Pandas库,更轻量化,尤其在只需要基础数值处理的场景下更高效。
内容的提问来源于stack exchange,提问作者srdg
相关产品推荐
相关产品推荐

