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

如何将长度不规则的列表列转换为二进制矩阵列表?

如何将长度不规则的列表列转换为二进制矩阵列表?

嗨,我来帮你解决这个问题!你遇到的核心问题是Keras的to_categorical要求输入是形状统一的数组,但你的子列表长度不一,padding后再unpadding确实很麻烦。其实我们可以绕开这个限制,直接针对每个元素生成独热编码,完美保留原列表的不规则结构。

方法一:纯Python实现(简单直观)

这种方式不需要依赖任何额外库,直接遍历每个元素生成对应的二进制向量:

# 你的原始数据
data = [[1, 2, 3], [1], [3, 2]]

# 先确定所有元素中的最大值,用来定义二进制向量的长度
max_val = max(num for sublist in data for num in sublist)

# 逐个转换每个子列表
result = []
for sublist in data:
    one_hot_sublist = []
    for num in sublist:
        # 初始化一个全0的向量,长度等于最大值
        vec = [0] * max_val
        # 把对应位置设为1(注意你的元素是从1开始的,所以要减1取索引)
        vec[num - 1] = 1
        one_hot_sublist.append(vec)
    result.append(one_hot_sublist)

print(result)
# 输出就是你想要的结果:
# [[[1,0,0],[0,1,0],[0,0,1]], [[1,0,0]], [[0,0,1],[0,1,0]]]

方法二:Numpy实现(高效适合大数据)

如果你的数据量比较大,用Numpy来实现会更高效,利用矩阵索引快速生成独热编码:

import numpy as np

data = [[1, 2, 3], [1], [3, 2]]
max_val = max(num for sublist in data for num in sublist)

result = []
for sublist in data:
    # 把列表转成Numpy数组,因为元素是1-based,所以先减1转为0-based索引
    arr = np.array(sublist) - 1
    # 用单位矩阵生成独热编码,再转成列表保持原结构
    one_hot = np.eye(max_val)[arr].tolist()
    result.append(one_hot)

为什么不用Keras的to_categorical?

to_categorical设计的初衷是处理批量的、形状统一的输入(比如经过padding的序列),它会强制输出统一形状的张量,这就导致你必须先padding所有子列表到相同长度,之后还要手动去除多余的padding部分,反而增加了不必要的复杂度。而上面两种方法直接保留了原列表的不规则长度,完全不需要处理padding相关的问题。

备注:内容来源于stack exchange,提问作者yannush

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 11:59:30