是否将列表内插到特定长度? [英] Interpolate list to specific length?

查看:34
本文介绍了是否将列表内插到特定长度?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想增加一个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中对另一个略微相关的问题(其中包括一个可能有助于可视化该过程的图形)执行了类似的操作。

这篇关于是否将列表内插到特定长度?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆