如何拼接3D与2D数组:将指定形状数组合并为目标形状
如何合并两个特定形状的numpy数组
嘿,我来帮你搞定这个维度合并的问题!首先得明确咱们的目标:把形状为(4133,10000,12)的数组(就叫它arr1吧)和(4133,2)的数组(arr2)合并成(4133,10000,12,2)的结果。核心思路是利用numpy的广播机制来对齐维度,这样既高效又省内存。
具体步骤
- 给两个数组补全维度:
- 对于
arr1,在最后添加一个维度,将形状从(4133,10000,12)变为(4133,10000,12,1),方便后续和arr2的扩展维度拼接。 - 对于
arr2,在中间插入两个维度,将形状从(4133,2)变为(4133,1,1,2)——借助numpy的广播机制,这个形状会自动适配成(4133,10000,12,2)的逻辑形状,无需实际复制数据。
- 对于
- 沿着最后一维拼接:
将补全维度后的两个数组沿最后一个维度(axis=-1)拼接,即可得到目标形状的数组。
代码实现
这里给你两种写法,功能完全一致,看你习惯哪种风格:
写法一(用np.expand_dims明确添加维度)
import numpy as np # 假设你的两个数组已经定义完成 arr1 = np.random.rand(4133, 10000, 12) arr2 = np.random.rand(4133, 2) # 扩展数组维度 arr1_expanded = np.expand_dims(arr1, axis=-1) # 形状变为(4133,10000,12,1) arr2_expanded = np.expand_dims(np.expand_dims(arr2, axis=1), axis=2) # 形状变为(4133,1,1,2) # 拼接得到最终结果 result = np.concatenate([arr1_expanded, arr2_expanded], axis=-1) print(result.shape) # 输出:(4133, 10000, 12, 2)
写法二(用None简化维度扩展)
numpy支持用None快速插入维度,代码会更简洁:
import numpy as np arr1 = np.random.rand(4133, 10000, 12) arr2 = np.random.rand(4133, 2) # 用None添加维度,效果和expand_dims完全相同 arr1_expanded = arr1[..., None] # ...代表保留前面所有维度,最后新增一维 arr2_expanded = arr2[:, None, None, :] # 在第1、2位插入新维度 result = np.concatenate([arr1_expanded, arr2_expanded], axis=-1) print(result.shape) # 同样输出目标形状
小提醒:别用np.tile
可能有人会想到用tile来重复arr2的元素,但非常不推荐——tile会实际复制大量数据,对于你这种规模的数组来说,会占用极大的内存空间。而广播机制只是逻辑上的维度扩展,不会额外消耗内存,效率高得多。
内容的提问来源于stack exchange,提问作者bjornsing
相关产品推荐
相关产品推荐

