在 y 坐标的多维数组上矢量化一维插值

时间:2021-01-30 02:34:15

标签: python numpy vectorization

我有一个 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 循环,有没有更快、更有效的方法来做到这一点?

1 个答案:

答案 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)