使用sklearn LabelEncoder编码元组列表触发维度报错的解决方法
输入适配方案
LabelEncoder仅支持接收1维、元素可哈希的序列输入,传入等长二元组列表时会被自动解析为形状(N,2)的二维数值数组,触发维度校验报错,且该组件没有可调整维度解析逻辑的参数,可通过以下两种适配方式完成编码:
方式1:手动构建元素为元组的1维object类型数组
numpy默认会将同长度元组组成的列表自动拼接为二维数值数组,手动指定dtype=object可以让每个元组作为独立的数组元素存储,保持1维结构,同时保留元组本身的可哈希属性,编码时可直接识别不同元组的差异。
示例代码:from sklearn.preprocessing import LabelEncoder import numpy as np raw_tuples = [(4,5), (6, 7), (1, 1), (6, 7)] # 构建1维object数组,避免自动拆分元组为二维结构 adapted_input = np.array(raw_tuples, dtype=object) le = LabelEncoder() le.fit(adapted_input) # 编码结果为 [1 2 0 2],与列表中的不同元组一一对应 print(le.transform(adapted_input))方式2:将每个元组转换为独立的可哈希单值,构造纯标量组成的1维列表
选择和原元组一一映射的可哈希标量(如带分隔符的字符串、冻结集合)作为列表元素,让整个列表成为天然的1维标量序列,转换为numpy数组时不会被解析为二维结构。
示例代码:from sklearn.preprocessing import LabelEncoder raw_tuples = [(4,5), (6, 7), (1, 1), (6, 7)] # 将每个元组转为带标识的字符串,保证映射唯一 adapted_input = [f"({tup[0]},{tup[1]})" for tup in raw_tuples] le = LabelEncoder() le.fit(adapted_input) # 编码结果为 [1 2 0 2] print(le.transform(adapted_input))
注意:两种方式都要保证转换后的元素为可哈希类型,不能使用列表等可变结构做转换映射,且要避免标识冲突(比如不要直接把元组的两个数值简单拼接为整数,防止不同元组映射到同一个数值引发编码错误)。
内容的提问来源于stack exchange,提问作者Proko
相关产品推荐
相关产品推荐

