Python中使用OrdinalEncoder编码序数分类值遇维度错误求助
解决OrdinalEncoder的ValueError:Expected 2D array, got 1D array instead
这个问题其实很常见,核心原因是**OrdinalEncoder和LabelEncoder的输入要求不一样**:
LabelEncoder是专门为单一列(或1D数组)设计的,所以你之前用它处理其他列时完全没问题;- 而
OrdinalEncoder是用来处理多列特征的编码器,它要求输入必须是2D数组(哪怕你只处理一列),但你提取的X[:,2]是1D的(形状类似(n_samples,)),这就触发了报错。
另外还有一个小细节:你给OrdinalEncoder的categories参数传的是一维列表,但这个参数要求传入嵌套列表(每个子列表对应一列的自定义顺序),这个不修正的话后续也会出问题。
修正后的代码片段
替换你原来的编码部分:
category_array = ["Tiny Mongra","Mini Mongra","Mongra","Super Mongra","Mini Dubar","Dubar","Super Dubar","Mini Tibar","Tibar","Super Tibar","2nd Wand","Super 2nd Wand","1st Wand"] # 把categories改成嵌套列表,适配OrdinalEncoder的要求 ordinalencoder_X_3 = OrdinalEncoder(categories=[category_array]) # 将1D的列转为2D数组,编码后再转回1D赋值回原数组 X[:, 2] = ordinalencoder_X_3.fit_transform(X[:, 2].reshape(-1, 1)).flatten()
或者你也可以用双括号索引直接获取2D的列,这样更简洁:
X[:, 2] = ordinalencoder_X_3.fit_transform(X[:, [2]]).flatten()
验证效果
这样修改后,编码结果会严格按照你定义的顺序:
- "Tiny Mongra" → 0
- "Mini Mongra" → 1
- ...
- "1st Wand" → 12
完全符合你的预期。
内容的提问来源于stack exchange,提问作者Anhad Singh Arora
相关产品推荐
相关产品推荐

