Numpy 二维阵列的线性插值

Numpy 二维阵列的线性插值,numpy,scipy,interpolation,array-broadcasting,Numpy,Scipy,Interpolation,Array Broadcasting,在前一个问题()中,有人询问了实现以下内容的最快方法: np.array([np.interp(X[i], x, Y[i]) for i in range(len(X))]) 假设X和Y是具有多行的矩阵,因此for循环的成本很高。在这种情况下,有一个很好的解决方案可以避免for循环(参见上面的链接答案) 我面临着一个非常类似的问题,但我不清楚在这种情况下是否可以避免for循环: np.array([np.interp(x, X[i], Y[i]) for i in range(len(X))

在前一个问题()中,有人询问了实现以下内容的最快方法:

np.array([np.interp(X[i], x, Y[i]) for i in range(len(X))])
假设
X
Y
是具有多行的矩阵,因此for循环的成本很高。在这种情况下,有一个很好的解决方案可以避免for循环(参见上面的链接答案)


我面临着一个非常类似的问题,但我不清楚在这种情况下是否可以避免for循环:

np.array([np.interp(x, X[i], Y[i]) for i in range(len(X))])
换句话说,我想使用线性插值对存储在两个矩阵
X
Y
行中的大量信号进行上采样。 我希望在numpy或scipy(scipy.interpolate.interp1d)中找到一个通过广播语义支持此操作的函数,但到目前为止,我似乎还没有找到

其他要点:

  • 如果有帮助的话,行
    X[i]
    X
    将在我的应用程序中预先排序。另外,在我的例子中,
    len(x)
    len(x[i])
    大很多

  • 该函数几乎满足我的要求,但它不使用线性插值


这是一种直接实现线性插值的矢量化方法。首先,对于每个x值和每个i,j计算权重
w
,表示x的左侧有多少间隔(x[i,j],x[i,j+1])

  • 如果整个间隔位于x的左侧,则该间隔的权重为1
  • 如果没有子间隔在左侧,则权重为0
  • 否则,权重是一个介于0和1之间的数字,表示该间隔与x左侧的比例
然后将PL interplant的值计算为Y[i,0]+差值之和dY[i,j]乘以相应的权重。逻辑是根据插入剂在不同间隔之间的变化量来确定。差异
dY=np.diff(Y,轴=1)
显示了它在整个时间间隔内的变化程度。乘以相应变化的权重

设置,使用一些小数据阵列 计算 示范 这只是为了表明插值是正确的。蓝点:原始数据,计算红色数据

import matplotlib.pyplot as plt
plt.plot(x, y[0], 'ro')
plt.plot(X[0], Y[0], 'bo')
plt.plot(x, y[1], 'rd')
plt.plot(X[1], Y[1], 'bd')
plt.show()

这假设(X,Y)的所有元素具有相同的长度,但:\
dX = np.diff(X, axis=1)
dY = np.diff(Y, axis=1)
w = np.clip((x - X[:, :-1, None])/dX[:, :, None], 0, 1)
y = Y[:, [0]] + np.sum(w*dY[:, :, None], axis=1)
import matplotlib.pyplot as plt
plt.plot(x, y[0], 'ro')
plt.plot(X[0], Y[0], 'bo')
plt.plot(x, y[1], 'rd')
plt.plot(X[1], Y[1], 'bd')
plt.show()