将列表插入特定长度?

时间:2017-05-29 09:05:46

标签: 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 个答案:

答案 0 :(得分:2)

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

例如,如果计算到原始列表中的小数索引是2.333 ...,则结果值将是 1 / 3 之间的值在original[2]original[3]

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

import sys
EPSILON = sys.float_info.epsilon  # smallest possible difference

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


def interpolate(inp, fi):
    i = int(fi)
    f = fi - i
    return (inp[i] if f < EPSILON else
            inp[i] + f*(inp[i+1]-inp[i]))

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

delta = (len(inp)-1) / float(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中对另一个与边缘相关的问题做了类似的事情(包括可能有助于可视化过程的图形)。

答案 1 :(得分:0)

引用Wikipedia

  

插值是一种在一组离散的已知数据点范围内构造新数据点的方法。

因此传统上插值用于计算给定x 的新值y 已知值f(x1)和f(x2)之间。您的公式是线性插值的公式,它至少假定x1和x2之间的线性行为。

在您的示例中,为列表提供值,您希望通过插值来扩展,因此我假设它们是您的 y值

  

[1, 3, 5, 7, 9]

您未给出的是相应的 x值。根据您的预期结果,我认为它们应该是相同的:

  

f(1)=1, f(3)=3 ...

现在你将范围扩展到10,这是经典线性插值的一个问题,因为你没有已知的上部f(x)来进行计算。

解释您的预期结果,您假设一般线性,这意味着您给定y值的基函数是全局线性的,可以假设为f(x)=x。如果您的数据属于这种情况,则无需计算每个点的公式:计算一次线性函数(使用任意两个不同的点)并使用此函数计算任何所需的f(x)。

如果您的目标函数是全局线性的,则无法插入大于最大f(x)或小于最小f(x)的任何值 - 并且对于任何x in between,你不仅需要f(x)值,还需要产生它们的x值。