NumPy 在不同时间步长的两个二维数组之间进行插值

NumPy Interpolate Between Two 2-D Arrays At Various Timesteps

我有一对来自网格化数据集(GeoTIFF 格式)的二维数组,两者的分辨率和 rows/columns.

的数量完全相同

假设数组 #1 的时间步长为 +0 小时,而数组 #2 的时间步长为 +3 小时。我希望在线性插值中以间隔 [1,2] 插值和创建额外的数组。

我已经仔细阅读了 关于利用 scipy 通过堆叠一维数组实现此目的的信息,但如果可能的话我更愿意在 NumPy 中执行此操作。

以预定间隔生成这些额外的插值二维数组的最佳方法或起点是什么?

我相信你只是在问如何做到这一点:

import numpy as np
t0 = 0
a0 = np.array([[0,0,0],[1,1,1],[2,2,2]], dtype=np.float64)
t3 = 3
a3 = np.array([[3,3,3],[0,5,0],[-2,0,2]], dtype=np.float64)
aDiff = a3 - a0
t1 = 1
a1 = a0 + aDiff * ((t1 - t0) / (t3 - t0))
t2 = 2
a2 = a0 + aDiff * ((t2 - t0) / (t3 - t0))
print(a0)
print(a1)
print(a2)
print(a3)

输出:

[[0. 0. 0.]
 [1. 1. 1.]
 [2. 2. 2.]]
[[1.         1.         1.        ]
 [0.66666667 2.33333333 0.66666667]
 [0.66666667 1.33333333 2.        ]]
[[ 2.          2.          2.        ]
 [ 0.33333333  3.66666667  0.33333333]
 [-0.66666667  0.66666667  2.        ]]
[[ 3.  3.  3.]
 [ 0.  5.  0.]
 [-2.  0.  2.]]

如果您想要更通用的解决方案,可以这样做:

  • 将二维输入数组之间的差异重塑为一维
  • 重复此行 n 次以进行 n 次所需的插值
  • 将第 i 行乘以相应的插值因子 (t[i] - tFirst) / (tNext - tFirst) 使每一行都包含该插值时间的必要插值步骤
  • 将第一个二维数组的重复一维行版本添加到这些插值步骤中,以获得 row-by-row 一维形状的结果
  • 在每个插值时间重塑为包含 2D 结果的 3D 数组

示例代码:

import numpy as np
tFirst, aFirst = 0, np.array([[0,0,0],[1,1,1],[2,2,2]], dtype=np.float64)
tNext, aNext = 3, np.array([[3,3,3],[0,5,0],[-2,0,2]], dtype=np.float64)
tInterp = np.array([1, 2])

aDiff1D = np.reshape(aNext - aFirst, (1, np.size(aFirst)))
aDiffRepeated = np.repeat(aDiff1D, np.size(tInterp), axis=0)
aStep = aDiffRepeated * ((tInterp[:, None] - tFirst) / (tNext - tFirst))
aInterp = np.repeat(np.reshape(aFirst, (1, np.size(aFirst))), np.size(tInterp), axis = 0) + aStep
aInterp = np.reshape(aInterp, (np.size(tInterp), aFirst.shape[0], aFirst.shape[1]))
a1 = aInterp[0]
a2 = aInterp[1]