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])
- 该函数几乎满足我的要求,但它不使用线性插值
w
,表示x的左侧有多少间隔(x[i,j],x[i,j+1])
- 如果整个间隔位于x的左侧,则该间隔的权重为1李>
- 如果没有子间隔在左侧,则权重为0
- 否则,权重是一个介于0和1之间的数字,表示该间隔与x左侧的比例李>
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()