如何将含(3,x)二维列表的一维Python列表转为Keras LSTM可用的三维列表/数组
解决方案:将可变长度二维列表转换为三维结构用于Keras LSTM
一、直接转换为三维列表
你当前的输入列表本身已经是符合要求的三维结构:外层是3000个元素的列表,每个元素是(3, x)的二维列表,整体形状就是(3000, 3, x)(其中x可随元素变化)。如果需要显式构造,用简单的列表推导式即可:
# input_list 是你的原始(3000,)列表 three_d_list = [item for item in input_list]
二、转换为NumPy数组(适配Keras LSTM输入)
由于NumPy要求数组形状规整,若每个元素的x长度不同,需要先对数据进行填充(padding),统一到最大x长度。另外注意:Keras LSTM的标准输入形状是(样本数, 时间步数, 特征数),需根据你的数据含义调整维度:
情况1:3是时间步数,x是特征数
如果3代表时间步,x代表每个时间步的特征数,按以下步骤处理:
import numpy as np input_list = [你的原始列表] # 找到所有元素中的最大特征数 max_x = max(len(row) for item in input_list for row in item) # 对每个元素填充0到(3, max_x) padded_data = [] for item in input_list: padded_item = [row + [0]*(max_x - len(row)) for row in item] padded_data.append(padded_item) # 转换为NumPy数组,形状为(3000, 3, max_x) three_d_array = np.array(padded_data)
情况2:x是时间步数,3是特征数(更符合LSTM常规用法)
如果x是时间步,3是每个时间步的特征数,需要先转置每个二维列表的维度,再填充:
import numpy as np input_list = [你的原始列表] # 找到所有元素中的最大时间步数 max_x = max(len(item[0]) for item in input_list) # 转置并填充 padded_data = [] for item in input_list: # 将(3, x)转置为(x, 3),即时间步在前,特征在后 transposed_item = list(zip(*item)) # 填充0到(max_x, 3) padded_transposed = transposed_item + [[0]*3]*(max_x - len(transposed_item)) padded_data.append(padded_transposed) # 转换为NumPy数组,形状为(3000, max_x, 3),符合LSTM输入要求 three_d_array = np.array(padded_data)
内容的提问来源于stack exchange,提问作者emilector
相关产品推荐
相关产品推荐

