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

如何堆叠不同形状数组?解决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]。

错误分析
  1. numpy中np.random.randn的参数是数值而非列表,正确写法是np.random.randn(2,5);
  2. numpy堆叠接口的参数是axis,而非PyTorch中的dim,混用会导致问题;
  3. 错误地将数组的shape元组当作张量调用unsqueeze,shape是元组没有该方法,应该直接操作数组本身;
  4. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 03:40:19