Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将列表插入到特定长度?_Python_List_Interpolation - Fatal编程技术网

Python 将列表插入到特定长度?

Python 将列表插入到特定长度?,python,list,interpolation,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,如何插值 是否有一个库,它提供了一个我不知道的函数?或者有人可以给我举个例子 编辑:列表中的数据不是线性的。

我想在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]
引述:

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

因此,传统上,插值用于计算已知f(x1)和f(x2)之间给定x的y的新值。您的公式是线性插值的公式,它假设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,不仅需要f(x)值,但是另外,产生它们的x值。

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

例如,如果计算到原始列表中的分数索引是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]

注意:我在另一个稍微相关的问题中做了类似的事情(其中包括一个可能有助于可视化过程的图形)。

如果您的数据是线性的,而不仅仅是逐步线性的,那么您可以得到它们的最大值和最小值,并创建所有rest@ChristianK它应该是
/(x2-x1)
像枚举数一样看看。列表中的所有值都必须是整数吗?@antarkt1s我仍然觉得你的问题太宽泛了,说实话。但是,由于数据不一定是线性的,你可以做的另一件事是对它们进行排序,迭代地找到最大的空白,并通过假设函数在局部线性地运行来填充它们。因此r你的列表中有217个元素需要变成240,找到23个最大的差距,并根据差距边缘在那里植入新的值。这正是我需要的!非常感谢你@martineau!@antarkt1s:听到这个消息很好,因为我不太确定,因为结果不是
[1,2,3,4,5,6,7,8,9,10]
就像你的问题一样,给出了相同的输入值列表。它不是通用的,只需尝试长度为27的inp和新的\u len=100@DYEZ:我明白你的意思。在做浮点运算时很难避免这样的问题。一个简单的解决方法是只复制传递给
inp的
inp序列的最后一个元素用a
inp2=inp+[inp[-1]]
插值()
,然后无条件地返回inp2[i]+f*(inp2[i+1]-inp2[i])