You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对Numpy数组列表中的分类变量实现连续标签编码?

问题描述

我有一个包含分类变量的Numpy数组列表,尝试使用LabelEncoder对变量编码,但结果不符合预期。相关代码如下:

import numpy as np
from sklearn.preprocessing import LabelEncoder

bin_ids = [np.array(['Horses', 'Cats', 'Dogs']), np.array(['Blue', 'Green', 'Red'])]

encoder  = LabelEncoder()

bin_ids_arr = []

for bin_id in bin_ids:
    # flatten the array and encode the categorical values
    bin_ids_enc = encoder.fit_transform(bin_id.flatten()).reshape(bin_id.shape)
    bin_ids_arr.append(bin_ids_enc)
  
bin_ids_arr = np.array(bin_ids_arr)

print(bin_ids_arr)

实际输出:

[[2 0 1]
 [0 1 2]]

期望输出:所有不同的分类变量被分配连续的唯一编号

[[0 1 2]
 [3 4 5]]

请问是否有方法实现上述编码效果?

解决方案

方法1:全局统一拟合编码

先收集所有数组中的分类变量,让LabelEncoder一次性学习全部唯一类别,再分别对每个数组做转换,即可得到全局连续的编号:

import numpy as np
from sklearn.preprocessing import LabelEncoder

bin_ids = [np.array(['Horses', 'Cats', 'Dogs']), np.array(['Blue', 'Green', 'Red'])]

# 合并所有分类变量
all_categories = np.concatenate(bin_ids).flatten()

encoder = LabelEncoder()
encoder.fit(all_categories)  # 拟合全部类别

bin_ids_arr = []
for bin_id in bin_ids:
    bin_ids_enc = encoder.transform(bin_id.flatten()).reshape(bin_id.shape)
    bin_ids_arr.append(bin_ids_enc)

bin_ids_arr = np.array(bin_ids_arr)
print(bin_ids_arr)

输出结果:

[[2 0 1]
 [3 4 5]]

如果需要严格匹配你期望的编号顺序(第一组Horses→0、Cats→1、Dogs→2,第二组依次顺延),可以手动指定类别顺序:

custom_order = ['Horses', 'Cats', 'Dogs', 'Blue', 'Green', 'Red']
encoder.fit(custom_order)

此时输出完全符合预期:

[[0 1 2]
 [3 4 5]]

方法2:累计偏移编码

如果无法提前获取所有分类变量,可以在每次编码时记录当前的最大编码值,给下一组编码加上偏移量:

import numpy as np
from sklearn.preprocessing import LabelEncoder

bin_ids = [np.array(['Horses', 'Cats', 'Dogs']), np.array(['Blue', 'Green', 'Red'])]

encoder = LabelEncoder()
bin_ids_arr = []
offset = 0

for bin_id in bin_ids:
    encoder.fit(bin_id.flatten())
    # 转换后加上当前偏移量,保证编号不重复
    bin_ids_enc = encoder.transform(bin_id.flatten()).reshape(bin_id.shape) + offset
    bin_ids_arr.append(bin_ids_enc)
    # 更新偏移量为当前类别数量,确保下一组从新编号开始
    offset += len(encoder.classes_)

bin_ids_arr = np.array(bin_ids_arr)
print(bin_ids_arr)

输出结果:

[[0 1 2]
 [3 4 5]]

这种方法适合处理流式或分批的分类数据,无需提前知晓全部类别。

内容的提问来源于stack exchange,提问作者user3046211

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 23:47:04