如何对二维NumPy数组做居中处理?及实现区域平均的方法
NumPy相关问题解答
1. 二维NumPy数组的居中处理
数组居中通常分为两种场景,对应不同实现方式:
- 数值零均值化:将数组调整为整体均值为0,可全局或按行/列处理
import numpy as np arr = np.array([[1,2,3],[4,5,6]]) # 全局居中:所有元素减去数组整体均值 global_centered = arr - arr.mean() # 按行居中:每行元素减去该行均值 row_centered = arr - arr.mean(axis=1, keepdims=True) # 按列居中:每列元素减去该列均值 col_centered = arr - arr.mean(axis=0, keepdims=True) - 空间居中放置:将原数组在更大尺寸的画布中居中对齐
original = np.array([[1,2],[3,4]]) target_shape = (4,4) # 计算上下左右的填充量 pad_top = (target_shape[0] - original.shape[0]) // 2 pad_left = (target_shape[1] - original.shape[1]) // 2 # 创建目标数组并填充原数组 space_centered = np.zeros(target_shape) space_centered[pad_top:pad_top+original.shape[0], pad_left:pad_left+original.shape[1]] = original
2. 实现指定的2x2区域滑动平均
你需要计算的是原数组中每个相邻2x2窗口的均值(uc(i,j) = 0.25*(u(i,j)+u(i,j+1)+u(i+1,j)+u(i+1,j+1))),用NumPy切片即可高效实现,无需依赖scipy.ndimage.generic_filter:
实现代码
import numpy as np A = np.array([[3, 4, 5],[5, 6, 7],[7, 8, 9]]) # 取四个对应区域的切片相加后取平均 uc = 0.25 * (A[:-1, :-1] + A[:-1, 1:] + A[1:, :-1] + A[1:, 1:])
输出结果
array([[4.5, 5.5], [6.5, 7.5]])
完全符合预期:第一个元素为(3+4+5+6)/4=4.5,后续元素依次对应相邻2x2窗口的均值。
原方法问题分析
你之前使用generic_filter未得到正确结果,是因为size=2会对原数组的每个元素位置生成2x2窗口,边缘位置的窗口会包含cval=np.nan填充值,np.nanmean会忽略这些nan,只计算窗口内的有效值,导致边缘结果不符合预期。如果一定要用generic_filter,需要调整窗口偏移并修改填充模式,但切片方法更直接高效。
内容的提问来源于stack exchange,提问作者wander95
相关产品推荐
相关产品推荐

