首页 > 解决方案 > 将列表内插为四倍长度

问题描述

我需要你的帮助。因此,目标是在列表中的每个元素之间进行插值,以使其长度增加四倍。所以我确实有一个清单,例如:

列表 = [ 1 , 5 , 2 , 6 , 8 ]

我想要的结果是:

new_list = [ 1 ,2 ,3 ,4 , 5 ,4.25 ,3.5 ,2.75, 2 , 3, 4, 5, 6 , 6.5, 7, 7.5 , 8 ,8 ,8 ,8 ]。

我想采用列表中的 5 个元素,在每个元素之间进行插值,因此在原始元素之间再添加 3 个值。因为我无法插入最后一个值,所以我只想再添加三个,在本例中为 8s。

为了更好地理解,我将列表的原始元素标记为粗体。因此,新列表的正常打印元素是每对之间的插值。我希望我能够以一种可以合理理解的方式表达这个问题。

我尝试的代码是以下代码,我也在此处找到:

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, 5, 2, 6, 8]
new_len = 20

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, 1.842, 2.684, 3.526, 4.368, 4.842, 4.211, 3.579, 2.947, 2.316, 2.421, 3.263, 4.105, 4.947, 5.789, 6.316, 6.737, 7.158, 7.579, 8.000]

代码的问题是原始元素没有被新列表采用。

标签: pythonlistinterpolation

解决方案


此函数接受两个参数,一个列表和一个扩展因子,在您的示例中为 4,并返回一个新列表。它不是很优雅,但我相信它可以完成这项工作:

def interpolate(l, expansion_factor):
    assert expansion_factor >= 1
    new_l = l.copy()
    if expansion_factor == 1:
        return new_l
    length = len(new_l)
    i = length - 2
    while i >= 0:
        next = i + 1
        value = new_l[next]
        delta = (value - new_l[i]) / expansion_factor
        for cnt in range(expansion_factor - 1):
            value -= delta
            if int(value) == value:
                value = int(value)
            new_l.insert(next, value)
        i -= 1
    # last element
    value = new_l[-1]
    for i in range(expansion_factor - 1):
        new_l.append(value)
    return new_l

print(interpolate([1, 5, 2, 6, 8], 4))

印刷:

[1, 2, 3, 4, 5, 4.25, 3.5, 2.75, 2, 3, 4, 5, 6, 6.5, 7, 7.5, 8, 8, 8, 8]

推荐阅读