如何将长度不规则的列表列转换为二进制矩阵列表?
如何将长度不规则的列表列转换为二进制矩阵列表?
嗨,我来帮你解决这个问题!你遇到的核心问题是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
相关产品推荐
相关产品推荐

