首页 > 解决方案 > 用轴 0 上的插值替换 3D 矩阵中的 NaN

问题描述

我有一个 3D 矩阵,其中一些切片(轴 1 和 2)有时有 NaN,有时用 NaN 填充,有时用数字填充。我想通过在轴 0 上应用“最近邻”插值来插值 NaN。这样,如果例如 arr[0,0,0] 是 NaN,我的算法将搜索 arr[1:-1,0 ,0] 最接近的值并对其进行插值以将 arr[0,0,0] 替换为数字。

到目前为止,这就是我打算这样做的方式:

import numpy as np
from scipy import interpolate

arr = np.empty((4,4,5))
arr[:] = np.nan
arr[0] = np.random.random()
arr[3] = np.random.random()
arr[0,0:2,0:2] = np.nan

def gap_filling(vect, interpolation):

    time = np.arange(0, np.shape(vect)[0])
    mask = np.isfinite(vect)
    f = interpolate.interp1d(time[mask], vect[mask], 
                             kind=interpolation, bounds_error=False)

    vect_filled = np.copy(vect)
    vect_filled[np.isnan(vect)] = f(time[np.isnan(vect)])

    return vect_filled

result = np.apply_along_axis(gap_filling, 0, arr, interpolation)

但是我有一个错误,因为如果我有一个只有 NaN 的向量(例如 arr[2,0,:]),则该函数不起作用。如果我的向量中只有孤立的 NaN,它就可以工作。我参加了几个论坛问题(通过在 Matlab中插值3D 矩阵层获取插值 2D 矩阵,在 Python插值 3D 数组,使用 numpy 和/或 scipy 插值 3D 体积),但没有一个被接受的答案适用于我的数组。

有更好的方法吗?最后,我希望我的数组“结果”充满值。

标签: pythonmultidimensional-arrayscipyinterpolation

解决方案


推荐阅读