NumPy如何将2D数组沿深度堆叠为3D数组并支持追加
NumPy沿首维度堆叠/追加2D数组为3D数组的实现方法
问题核心原因
你之前使用np.stack((d1,d2))得到形状为(2,3,3)的3D数组,是因为np.stack默认沿新增的第0轴(最外层维度)拼接数组。后续追加d3时报错,本质是输入的两个数组维度不匹配:此时foo是3维数组,d3是2维数组,无法直接拼接。
常用堆叠函数的规则差异
np.stack:为所有输入数组新增一个维度,再沿指定新轴拼接,默认新轴位置为axis=0,要求所有输入数组形状完全一致np.concatenate:沿数组已有的某个轴拼接,不会新增维度,要求除拼接轴外其余维度长度完全匹配np.vstack:沿第0轴拼接的快捷方法,等价于针对第0轴的concatenatenp.hstack:沿第1轴拼接的快捷方法np.dstack:沿第2轴(最后一个维度)拼接的快捷方法,拼接后深度维度在数组末尾,输出形状为(3,3,n),和你需要的(n,3,3)轴顺序不符,因此无法直接满足需求。
具体实现方案
方案1:已知所有待堆叠数组时一次性拼接
如果可以提前拿到所有需要堆叠的3×3 2D数组,直接调用np.stack指定axis=0即可一步得到目标结果:
import numpy as np d1 = np.arange(9).reshape(3,3) d2 = np.arange(9,18).reshape(3,3) d3 = np.arange(18,27).reshape(3,3) foo = np.stack([d1, d2, d3], axis=0) print(foo.shape) # 输出:(3, 3, 3) print(foo)
运行结果和你预期完全一致:
[[[ 0 1 2] [ 3 4 5] [ 6 7 8]] [[ 9 10 11] [12 13 14] [15 16 17]] [[18 19 20] [21 22 23] [24 25 26]]]
方案2:动态逐个追加数组
如果需要边生成数组边追加,优先用列表暂存所有数组,最后一次性转成3D数组,这种方式性能最优:
# 初始化列表存储所有待堆叠的2D数组 array_cache = [] # 逐个生成/读取数组,追加到缓存列表 array_cache.append(np.arange(9).reshape(3,3)) array_cache.append(np.arange(9,18).reshape(3,3)) array_cache.append(np.arange(18,27).reshape(3,3)) # 后续新增数组继续调用append即可 # 需要使用3D数组时一次性堆叠 foo = np.stack(array_cache, axis=0)
如果必须在已有3D数组的基础上直接追加新数组,需要先给新的2D数组增加一个第0轴维度,把形状从(3,3)转为(1,3,3),再沿第0轴拼接:
# 初始状态 d1 = np.arange(9).reshape(3,3) d2 = np.arange(9,18).reshape(3,3) foo = np.stack((d1,d2)) # 形状(2,3,3) # 追加d3 d3 = np.arange(18,27).reshape(3,3) foo = np.concatenate([foo, d3[np.newaxis, ...]], axis=0) # 也可以用vstack实现:foo = np.vstack([foo, d3[np.newaxis, ...]]) print(foo.shape) # 输出:(3, 3, 3),符合预期
内容的提问来源于stack exchange,提问作者jambormike
相关产品推荐
相关产品推荐

