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

如何对Numpy 4D数组按批次横向拼接子矩阵并调整形状?

解决4D NumPy数组按批次横向拼接矩阵的问题

要实现将形状为(a1, a2, a3, a4)的4D数组(a1个批次,每个批次含a2个(a3,a4)的2D矩阵)按批次沿最后一维横向拼接,最终得到(a1, a3, a4*a2)的数组,有两种高效方法:

方法一:使用np.concatenate直接拼接

通过提取每个批次内的所有矩阵,沿最后一维(列方向)拼接:

import numpy as np

# 示例数组
a1, a2, a3, a4 = 2, 3, 2, 2
arr = np.arange(a1*a2*a3*a4).reshape((a1, a2, a3, a4))

# 拼接操作
result = np.concatenate([arr[:, i] for i in range(a2)], axis=-1)

# 验证结果
print(result.shape)  # 输出 (2, 2, 6)
print(result[0, 0])  # 输出 [0 1 4 5 8 9],符合预期

方法二:转置+重塑(更高效)

通过调整轴的顺序,将矩阵数维度移到行维度之后,再直接重塑数组,避免循环和额外数据复制:

import numpy as np

# 示例数组
a1, a2, a3, a4 = 2, 3, 2, 2
arr = np.arange(a1*a2*a3*a4).reshape((a1, a2, a3, a4))

# 转置轴顺序为 (批次, 行, 矩阵数, 列),再重塑
result = arr.transpose(0, 2, 1, 3).reshape(a1, a3, -1)

# 验证结果
print(result.shape)  # 输出 (2, 2, 6)
print(result[0, 0])  # 输出 [0 1 4 5 8 9],符合预期

原理说明

  • 原数组轴顺序:(批次, 矩阵数, 行, 列) → (a1,a2,a3,a4)
  • 转置后轴顺序:(批次, 行, 矩阵数, 列) → (a1,a3,a2,a4),此时每个行对应的多个矩阵的列可以直接合并
  • 重塑时用-1让NumPy自动计算合并后的列数(即a2*a4),最终得到目标形状(a1,a3,a2*a4)

对于你提到的原始需求(输入形状(2,3,4,5)),只需替换对应参数,两种方法都能得到(2,4,15)的输出数组。

内容的提问来源于stack exchange,提问作者Ben Lahav

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 03:00:22