是否将列表内插到特定长度?

2022-04-04 00:00:00 python list interpolation

问题描述

我想增加一个python中列表的长度,而应该对中间和正确位置上的缺失值进行内插。示例:

[1, 3, 5, 7, 9]

插入到10的新长度将为:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

这只是两倍大小,可以使用以下数学公式进行内插,而每隔一秒内插一次:

y=y1+((y2-y1)/(x2-x1))*(x-x1)

但我在想,如果长度为217的列表需要内插到240长度,如何进行内插。

有没有为此提供函数的库,我不知道?或者谁能给我举个例子?

编辑:列表中的数据为非线性。因此,这样的列表是可能的:

[4.534, 1.2433. 3.353, 2.3452, 6.124, 8.124, 1.232]

解决方案

执行此操作的相对简单的方法是将新列表中的索引值映射到原始列表中的分数索引,然后使用分数部分在插入值的整数部分表示的原始列表值和下一个列表值之间进行线性内插(除非分数部分为零)。

例如,如果计算到原始列表中的分数索引是2.333...,则结果值将是original[2]original[3]中的值之间的1<⁄>3。

以下是实现这一想法的示例代码:

# For Python 2 compatibility.
from __future__ import division, print_function

def print_list(values):
    print('[' + ', '.join(format(value, '.3f') for value in values) + ']')

def interpolate(inp, fi):
    i, f = int(fi // 1), fi % 1  # Split floating-point index into whole & fractional parts.
    j = i+1 if f > 0 else i  # Avoid index error.
    return (1-f) * inp[i] + f * inp[j]

inp = [1, 3, 5, 7, 9]
new_len = 10

delta = (len(inp)-1) / (new_len-1)
outp = [interpolate(inp, i*delta) for i in range(new_len)]

print_list(inp)
print_list(outp)

输出:

[1.000, 3.000, 5.000, 7.000, 9.000]
[1.000, 1.889, 2.778, 3.667, 4.556, 5.444, 6.333, 7.222, 8.111, 9.000]

注意:我在my answer中对另一个略微相关的问题(其中包括一个可能有助于可视化该过程的图形)执行了类似的操作。

相关文章