Numpy 在二维阵列中使用interp1d的更快方法

Numpy 在二维阵列中使用interp1d的更快方法,numpy,scipy,Numpy,Scipy,结果是正确的。但在我的实际问题中,数据太大,所以我想直接应用插值,而不使用 循环。任何想法都将不胜感激 import numpy as np from scipy.interpolate import interp1d data = np.array([[99,0,3,4,5], [6,7,0,9,10], [11,22,0,14,15]],dtype=np.float32) data[data==0] = np.nan def

结果是正确的。但在我的实际问题中,数据太大,所以我想直接应用插值,而不使用 循环。任何想法都将不胜感激

import numpy as np
from scipy.interpolate import interp1d


data = np.array([[99,0,3,4,5],
               [6,7,0,9,10],
               [11,22,0,14,15]],dtype=np.float32)

data[data==0] = np.nan

def gap_fill(y):
    not_nan = ~np.isnan(y)
    x = np.arange(len(y))
    interp = interp1d(x[not_nan], y[not_nan], kind='linear')
    ynew = interp(x)
    return ynew

results = []
for d in data:
   gapfilled = gap_fill(d)
   results.append(gapfilled)
print results

[array([ 99.,  51.,   3.,   4.,   5.]), array([  6.,   7.,   8.,   9.,  10.]), array([ 11.,  22.,  18.,  14.,  15.])]

一时冲动,我想到的是:

In [8]: gap_fill(data.flatten()).reshape(data.shape)
Out[8]: 
array([[ 99.,  51.,   3.,   4.,   5.],
       [  6.,   7.,   8.,   9.,  10.],
       [ 11.,  22.,  18.,  14.,  15.]])
这适用于您的示例,因为所有的
nan
都位于行的内部。但是,对于行末端的元素,这会将外推转化为跨行的插值,这可能是您不希望的


严格地说,线性插值就是在两点之间寻找值,
(1-a)*x1+a*x2
,其中
0实际问题中
数据的大小是多少?当你有一个浮点数组时,你不想检查精确的零。此外,您还可以对间隙填充进行numpy矢量化。将
数据重塑为1d,并使用多个间隙进行1d插值。@JohnZwinck it is(50000,50000)。@hpaulj应为每行约束线性模型。
    slope = (y_hi - y_lo) / (x_hi - x_lo)[:, None]
    y_new = slope*(x_new - x_lo)[:, None] + y_lo