将3D NumPy数组添加到列表时生成一维数组的问题求助
问题分析与解决
你的核心错误是循环中每次都用单个数组覆盖了x_train变量,没有把处理后的数组添加到初始的列表里。初始时x_train是列表,但循环内的x_train = np.array(spectrogram)直接将其替换成单个numpy数组,后续循环继续覆盖这个变量,最终自然无法收集所有8620个数组。
修正后的代码
import os import numpy as np x_train = [] for root, _, file_names in os.walk(spectrograms_path): for file_name in file_names: file_path = os.path.join(root, file_name) spectrogram = np.load(file_path, allow_pickle=True) # 为数组添加新维度 processed_spec = spectrogram[..., np.newaxis] # 将处理后的数组添加到列表,而非覆盖变量 x_train.append(processed_spec) print(processed_spec.shape) # 循环结束后,将列表转换为统一的numpy数组 x_train = np.array(x_train) # 查看最终数组形状,应为 (8620, 原始3D维度, 1) print(x_train.shape)
关键说明
- 列表收集元素:先通过
append把每个处理好的数组添加到列表中,列表可以动态存储任意数量的数组(只要每个数组形状一致)。 - 统一转numpy数组:循环结束后再将整个列表转为numpy数组,这样会自动在第一个维度上拼接所有样本,得到形状为
(样本数, 原3D维度, 1)的4D数组,符合多数深度学习框架的输入要求。
如果之前尝试np.hstack/np.vstack无效,是因为这两个函数需要在指定轴上拼接,但前提是你已经收集了所有数组,而不是每次只处理一个就覆盖变量。
内容的提问来源于stack exchange,提问作者Amartya Chowdhury
相关产品推荐
相关产品推荐

