Numpy concatenate用法:如何正确拼接滑动窗口数组还原目标形状
解决方案
核心思路
你当前的windows数组形状为(n, d, a, b, c, c),其中a是垂直方向的窗口数量,b是水平方向的窗口数量,每个窗口尺寸为c×c。要还原为原始形状,只需要调整维度顺序后合并对应维度即可,不需要复杂操作。
实现代码
方法1:维度重排+reshape(性能最优)
import numpy as np # 本示例中windows.shape = (1, 1, 3, 3, 2, 2) # 调整维度顺序:将窗口行维度(a)和单窗口行维度(c)相邻,窗口列维度(b)和单窗口列维度(c)相邻 windows_reordered = windows.swapaxes(3, 4) # 合并维度得到目标形状 mask = windows_reordered.reshape(windows.shape[0], windows.shape[1], -1, windows.shape[3] * windows.shape[-1]) # 验证形状,输出为 (1, 1, 6, 6) print(mask.shape)
方法2:两次concatenate(更易理解)
如果你习惯用拼接逻辑实现,需要分别沿水平、垂直方向两次拼接窗口,注意不要直接传整个数组给np.concatenate:
# 第一步:沿水平方向(列维度)拼接同一行内的所有c×c窗口 step1 = np.concatenate(windows, axis=-1) # 第二步:沿垂直方向(行维度)拼接所有行的窗口 mask = np.concatenate(step1, axis=-2)
常见问题说明
- 为什么直接用
np.concatenate(windows, axis=2)会压缩n维度?np.concatenate的第一个参数需要是数组序列,如果直接传入高维数组,numpy会默认将第一个维度的每个元素作为待拼接的数组,所以会拆分n维度进行拼接,导致结果不符合预期。 - 为什么直接reshape顺序错误?
直接reshape是按照数组的内存存储顺序重组元素,原维度顺序(a, b, c, c)下,同一行窗口的元素不是连续存储的,必须先交换b和第一个c的位置,让同一块的行元素连续,才能reshape出正确顺序。
内容的提问来源于stack exchange,提问作者ramazan793
相关产品推荐
相关产品推荐

