为了简便起见,这显示了如何在与正上方和正下方的元件中值填补。剩余的2的情况下(或6,这取决于如何定义“相邻”)是类似的。
与矩阵A
开始,移动“向上”沿垂直轴元素可以
up = np.roll(A, 1, axis=0)
up[0, :] = np.nan
>>> up
array([[ nan, nan, nan, ..., nan, nan, nan],
[ 50., nan, 52., ..., nan, 128., nan],
[ nan, 52., nan, ..., 128., nan, 130.],
...,
[ 126., nan, 128., ..., nan, 204., nan],
[ nan, 128., nan, ..., 204., nan, 206.],
[ 128., nan, 130., ..., nan, 206., nan]])
同样可以发现,
down = np.roll(A, -1, axis=0)
down[-1, :] = np.nan
>>> down
array([[ nan, 52., nan, ..., 128., nan, 130.],
[ 52., nan, 54., ..., nan, 130., nan],
[ nan, 54., nan, ..., 130., nan, 132.],
...,
[ 128., nan, 130., ..., nan, 206., nan],
[ nan, 130., nan, ..., 206., nan, 208.],
[ nan, nan, nan, ..., nan, nan, nan]])
由于这是numpy的,你可以创建一个3D使用这些2(或更多)阵列轻松排列
np.array([up, down])
有了这个阵列Y,我们可以采取np.nanmedian
沿0轴(这仅仅是每个down
和up
):
np.nanmedian(np.array([up, down]), axis=0)
为了填补缺失的值在A
,使用
A[np.isnan(A)] = np.nanmedian(np.array([up, down]), axis=0)[np.isnan(A)]
P.S.由于所有的邻居可以把所有的组合轴= 0之间,-1 1,0,1个转移(0,0移是元件本身,这将不被使用无论如何由于该isnan
)中找到,则可以用双循环自动创建所有这些二维数组。
也许你可以使用屏蔽数组? http://docs.scipy.org/doc/numpy/reference/maskedarray.generic.html – maazza