我有一个 3D 阵列,我想将其扩展为新的 3D 阵列。第 3 轴的数据向量是排序数据,对应于固定的 x 坐标数组。我想沿着一个新的 x 坐标数组扩展第三个轴,这些值从原始数组的第三个轴线性插值到原始数组中的所有向量。换句话说,我必须多次应用线性插值才能创建所需的结果。我正在寻找一种快速的、可能是矢量化的解决方案。下面显示了使用嵌套 for 循环实现的虚拟数据的示例。这个解决方案很慢,因为我的原始数据集非常大
import numpy as np
fp = np.sort(np.random.rand(1000,100,10), axis = 2)
xp = np.linspace(0.0, 1.0, num=10)
x = np.linspace(0.0, 1.0, num=20)
result=np.zeros((1000,100,20))
for i in range(1000):
for j in range(100):
result[i,j,:] = np.interp(x,xp,fp[i,j,:])
没有 for 循环,有没有更快、更有效的方法来做到这一点?
答案 0 :(得分:0)
这不是最优雅的解决方案,但它可以完成工作。基本思想是将 fp
展平为一维数组,然后创建一个单调递增的 x 值序列进行插值。因此,fp.reshape(-1)
的前 10 个值在 [0,1] 区间内插值,接下来的 10 个值在 [2,3] 区间内插值,依此类推。这消除了循环并且只调用 interp
一次。
import numpy as np
fp = np.sort(np.random.rand(1000,100,10), axis = 2)
xp = np.linspace(0.0, 1.0, num=10)
x = np.linspace(0.0, 1.0, num=20)
bigxp = np.tile(xp, int(np.product(fp.shape) / 10)).reshape(-1,10)
offset = np.arange(0,200000,2).reshape(-1,1)
bigxp += offset
bigx = np.tile(x, int(np.product(fp.shape) / 10)).reshape(-1,20)
bigx += offset
result = np.interp(bigx.reshape(-1),
bigxp.reshape(-1),
fp.reshape(-1))
result = result.reshape(1000,100,20)