2017-05-29 111 views
2

我想增加python中列表的長度,而插入右側位置和右側位置的缺失值。例如:將列表內插到特定長度?

[1, 3, 5, 7, 9] 

插值到的新長度將是:

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

這僅僅是雙尺寸,並且可以與內插的以下數學公式來解決,而每個第二值插值:

Y = Y1 +((Y2 - Y1)/(X2 - X1))*(X - X1)

但我想牛逼o弄清楚,如果長度爲217的列表需要插值到240長度,如何進行插值。

有沒有圖書館,它提供了一個我不知道的功能?或者,也許有人可以給我一個例子?

編輯:列表中的數據是而不是線性。所以像這樣的列表是可能的:

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

如果你的數據必須是線性的,而不僅僅是逐步線性的,你可以得到它們的* max *和* min *值並創建所有其他的值。 –

+0

@ChristianKönig它應該是'/(x2 - x1) '像枚舉員 –

+3

看看[numpy.interp](https://docs.scipy.org/doc/numpy/reference/generated/numpy.interp.html)。 – Thomas

回答

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類似這樣的東西到另一個,輕微相關,問題(其中包括圖形這可能有助於可視化過程)。

+0

這正是我所需要的!謝謝@martineau! – antarkt1s

+0

@ antarkt1s:這很好聽 - 因爲我不完全確定,因爲結果不是'[1,2,3,4,5,6,7,8,9,10]「就像在你給出的問題中一樣相同的輸入值列表。 – martineau

0

引用Wikipedia

插值是一組離散的已知數據點的範圍內構建新的數據點的方法。

所以傳統上使用內插來計算Y的新值給定的x 之間F(X1)和f(×2)的已知值。您的公式是線性插值公式,它至少假定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值。