如何堆叠不同形状数组?解决RuntimeError维度不匹配问题
问题描述
我有一组形状不同的数组,想对它们进行堆叠。因为数组形状不一样,np.stack没法直接使用,想问能不能通过在axis=1(numpy中对应dim=1)维度上用np.stack处理?能不能沿第二维度堆叠这些形状不同的张量,得到形状为[ -, 2, 5]的3D数组?
我尝试过的代码示例:
import numpy as np data = [np.random.randn([2, 5]), np.random.randn([3, 5])] stacked = np.stack(data, dim=1)
还试过另一种方案:
f, s = data[0].shape, data[1].shape stacked = np.concatenate((f.unsqueeze(dim=1), s.unsqueeze(dim=1)), dim=1)
报错信息:
RuntimeError: Sizes of arrays must match except in dimension 1. Expected size 2 but got size 3 for array number 1 in the list.
还有一种PyTorch尝试:
l = torch.cat(f[:, None, :], s[:, None, :])
同样无效,期望输出数组形状为[:, 2, 4]。
错误分析
- numpy中
np.random.randn的参数是数值而非列表,正确写法是np.random.randn(2,5); - numpy堆叠接口的参数是
axis,而非PyTorch中的dim,混用会导致问题; - 错误地将数组的
shape元组当作张量调用unsqueeze,shape是元组没有该方法,应该直接操作数组本身; torch.cat要求除拼接维度外,其他维度长度必须匹配,你的输入f[:,None,:]形状为(2,1,5),s[:,None,:]为(3,1,5),第一维度长度不匹配,因此报错。
解决方案
你的输入数组形状为(2,5)和(3,5),核心矛盾是第一维度长度不一致,直接在第二维度堆叠无法满足numpy/PyTorch的维度匹配要求,可通过以下两种方式实现类似需求:
方式1:补全短数组至统一长度
将维度较短的数组用填充值(如0、均值)补至与长数组相同长度,之后再进行堆叠:
numpy实现
import numpy as np data = [np.random.randn(2, 5), np.random.randn(3, 5)] max_len = max(arr.shape[0] for arr in data) # 补全每个数组到max_len长度 padded_data = [] for arr in data: pad_len = max_len - arr.shape[0] # 此处用0填充,可替换为np.mean(arr)等自定义值 padded = np.pad(arr, ((0, pad_len), (0, 0)), mode='constant') padded_data.append(padded) # 沿axis=1堆叠,得到形状为(3,2,5)的3D数组 stacked = np.stack(padded_data, axis=1)
PyTorch实现
import torch data = [torch.randn(2, 5), torch.randn(3, 5)] max_len = max(arr.shape[0] for arr in data) padded_data = [] for arr in data: pad_len = max_len - arr.shape[0] # pad参数格式为(左,右,上,下),这里仅在第一维度下方补全 padded = torch.nn.functional.pad(arr, (0, 0, 0, pad_len)) padded_data.append(padded) # 沿dim=1堆叠,得到形状为torch.Size([3,2,5])的张量 stacked = torch.stack(padded_data, dim=1)
方式2:使用object类型数组保留原始长度
如果不想改变数组原始长度,可将数组存入object类型的numpy数组,虽然不是严格的3D张量,但能实现类似的存储与访问:
stacked_obj = np.array(data, dtype=object) # 访问方式:stacked_obj[0]对应(2,5)数组,stacked_obj[1]对应(3,5)数组
内容的提问来源于stack exchange,提问作者user20724838
相关产品推荐
相关产品推荐

