我有两个矩阵代表网格上不同时间的数量值。 我想在中间时间创建第三个矩阵,其像素在两个矩阵之间进行插值。
我尝试对每个像素进行简单的线性插值,但是如果我使用imshow
可视化最终产品,那么帧之间并没有平滑过渡。
我无法提供一个直接的例子,因为我正在处理一个庞大的数据集,但我想知道是否有人遇到过类似的问题。
我知道scipy.interpolate
函数,但它们似乎只是为了插入一组离散点而派上用场。
答案 0 :(得分:4)
由于原始数据已经网格化,您可以使用ndimage.map_coordinates
进行插值:
import numpy as np
import scipy.ndimage as ndimage
import matplotlib.pyplot as plt
# given 2 arrays arr1, arr2
arr1 = np.linspace(0, 1, 100).reshape(10,10)
arr2 = np.linspace(1, 0, 100).reshape(10,10)
# rejoin arr1, arr2 into a single array of shape (2, 10, 10)
arr = np.r_['0,3', arr1, arr2]
# define the grid coordinates where you want to interpolate
X, Y = np.meshgrid(np.arange(10), np.arange(10))
# 0.5 corresponds to half way between arr1 and arr2
coordinates = np.ones((10,10))*0.5, X, Y
# given arr interpolate at coordinates
newarr = ndimage.map_coordinates(arr, coordinates, order=2).T
fig, ax = plt.subplots(ncols=3)
cmap = plt.get_cmap('Greys')
vmin = np.min([arr1.min(), newarr.min(), arr2.min()])
vmax = np.max([arr1.max(), newarr.max(), arr2.max()])
ax[0].imshow(arr1, interpolation='nearest', cmap=cmap, vmin=vmin, vmax=vmax)
ax[1].imshow(newarr, interpolation='nearest', cmap=cmap, vmin=vmin, vmax=vmax)
ax[2].imshow(arr2, interpolation='nearest', cmap=cmap, vmin=vmin, vmax=vmax)
ax[0].set_xlabel('arr1')
ax[1].set_xlabel('interpolated')
ax[2].set_xlabel('arr2')
plt.show()
答案 1 :(得分:2)
假设矩阵是numpy数组,并且因为你只有两个点,你可以自己简单地实现(线性)插值:
def interp(m1, t1, m2, t2, t_interp):
return m1 + (m2-m1) / (t2-t1) * (t_interp-t1)
其中m1
/ m2
可以任意形成numpy数组,t1
/ t2
可以是相应的时间值。 t_interp将是插值的时间值。
因此,这为m1
提供了t_interp = t1
,为m2
提供了t_interp = t2
。