试图找到一种好的插值技术

2024-03-29 09:22:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在尝试使用Python插值一大组X和Y值。数组相当长(600万个值),我正在尝试将其扩展到1000万个值。鉴于我的问题,插值不应高于或低于Y的最小值/最大值。为此,我编写了一个函数来执行反距离加权(IDW)插值。然而,它只是需要太长的时间(至少10天)来完成。我使用IDW是因为数据也有点嘈杂,通过将p值设置为<;1.0它有效地使其平滑了一点。以下是我编写的函数:

def idw_simple(x, y, x_new, p):
    # interpolate 2D data using inverse distance weighted technique
    y_new = np.array([])

    for i in x_new:
        # Calc. distance for each x_new-value from every x-value 
        min_array = np.abs(x - i)
        min_array_sorted = np.sort(min_array)

        # Find 10 closest x-values 
        near_indices = [int(np.where(min_array == k)[0]) for k in min_array_sorted[:10]]

        # Calc. y_new based on nearby weighted points
        near_indices = np.sort(near_indices)
        weights = 1 / (min_array[near_indices] ** p)
        y_new = np.append(y_new, np.sum(weights * y[near_indices]) / weights.sum())

    return y_new

如果有人知道如何加速,或者有其他插值技术可以提供类似的结果,我很想听听人们的想法


Tags: 函数innewfornpcalcminarray
1条回答
网友
1楼 · 发布于 2024-03-29 09:22:42

如果输入数据按x的递增顺序排序,则可以更有效地执行“10个最近点”步骤。在循环初始化j = 0之前,然后在i循环体的顶部执行以下操作

while j < len(x) - 10 and abs(x[j+10] - i) < abs(x[j] - i):
    j = j + 1

然后x[j:j+10]y[j:j+10]将是每个循环迭代中距离i最近的10个点,无需每次对1000万个元素列表进行排序和筛选。这应该快很多倍

相关问题 更多 >