为何在3D NumPy数组中计算各矩阵对应像素中位数时需指定axis=2?
为什么计算中位数时要用axis=2而非axis=0?
你的核心困惑来自于对np.dstack生成的3D数组维度结构的误解,我们一步步拆解:
1. np.dstack的堆叠逻辑
假设每个FITS图像是形状为(height, width)的2D数组(比如100x100的像素矩阵),当你用np.dstack(FITS_list)把N个这样的2D数组堆叠时,得到的3D数组形状是(height, width, N)。也就是说:
- 第0轴(axis=0)对应图像的行方向(height)
- 第1轴(axis=1)对应图像的列方向(width)
- 第2轴(axis=2)对应不同FITS文件的同一像素位置(N个文件的同位置像素值集合)
2. np.median的axis参数作用
np.median(arr, axis=k)表示沿着第k轴的方向计算中位数,计算完成后该轴会被压缩:
- 如果用
axis=0:会沿着行方向(height)取中位数,相当于把每一列的不同行像素值求中位数,完全不是你要的“同一像素跨文件取中位数”。 - 如果用
axis=2:会沿着第3个维度(跨文件的同位置像素集合)取中位数,正好对应每个(y,x)位置,计算所有N个文件在该位置的数值中位数,完全符合需求。
举个直观小例子
# 两个2x2的模拟图像 arr1 = np.array([[1,2],[3,4]]) arr2 = np.array([[5,6],[7,8]]) # 用dstack堆叠 stacked = np.dstack([arr1, arr2]) # stacked形状为(2,2,2),内容: # [[[1,5], [2,6]], # [[3,7], [4,8]]] # 用axis=2计算中位数 np.median(stacked, axis=2) # 输出:[[3,4], [5,6]] → 每个位置两个数的中位数,符合预期 # 用axis=0计算中位数 np.median(stacked, axis=0) # 输出:[[2,4], [5,7]] → 沿行方向取中位数,完全不符合需求
内容的提问来源于stack exchange,提问作者wannabe-engineer
相关产品推荐
相关产品推荐

