两个二维数组的线性插值
Linear interpolation of two 2D arrays
在上一个问题 () 中,有人询问了实现以下内容的最快方法:
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])
大很多。
函数scipy.signal.resample
几乎是我想要的,但它没有使用线性插值...
这是一种直接实现线性插值的矢量化方法。首先,对于每个 x 值和每个 i, j 计算权重 w
,表示区间 (X[i, j], X[i, j+1]) 有多少位于 x 的左侧。
- 如果整个区间都在x的左边,则该区间的权重为1。
- 如果none的子区间在左边,则权重为0
- 否则,权重是一个介于0和1之间的数字,表示该区间在x左边的比例。
然后 PL 插值的值计算为 Y[i, 0] + 差值之和 dY[i, j] 乘以相应的权重。逻辑是遵循插值在区间之间的变化量。差异 dY = np.diff(Y, axis=1)
显示了它在整个时间间隔内的变化量。乘以相应变化的权重按比例分配。
设置,带有一些小数据数组
import numpy as np
X = np.array([[0, 2, 5, 6, 9], [1, 3, 4, 7, 8]])
Y = np.array([[3, 5, 2, 4, 1], [8, 6, 9, 5, 4]])
x = np.linspace(1, 8, 20)
计算
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)
示范[=24=]
这只是为了说明插值是正确的。蓝色点:原始数据,红色点计算。
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()
在上一个问题 (
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])
大很多。函数
scipy.signal.resample
几乎是我想要的,但它没有使用线性插值...
这是一种直接实现线性插值的矢量化方法。首先,对于每个 x 值和每个 i, j 计算权重 w
,表示区间 (X[i, j], X[i, j+1]) 有多少位于 x 的左侧。
- 如果整个区间都在x的左边,则该区间的权重为1。
- 如果none的子区间在左边,则权重为0
- 否则,权重是一个介于0和1之间的数字,表示该区间在x左边的比例。
然后 PL 插值的值计算为 Y[i, 0] + 差值之和 dY[i, j] 乘以相应的权重。逻辑是遵循插值在区间之间的变化量。差异 dY = np.diff(Y, axis=1)
显示了它在整个时间间隔内的变化量。乘以相应变化的权重按比例分配。
设置,带有一些小数据数组
import numpy as np
X = np.array([[0, 2, 5, 6, 9], [1, 3, 4, 7, 8]])
Y = np.array([[3, 5, 2, 4, 1], [8, 6, 9, 5, 4]])
x = np.linspace(1, 8, 20)
计算
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)
示范[=24=]
这只是为了说明插值是正确的。蓝色点:原始数据,红色点计算。
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()