您可以高效地將數據「包裝」到一個函數中。
如果您的數據是以列表的形式列出的,那麼您需要將其轉換爲dict
並創建t
值的排序列表。然後,您可以使用bisect
模塊中的列表平分算法對缺失值進行插值。
下面是一些使用Python 2編寫的演示代碼,但如果需要,它應該直接將其轉換爲Python 3。
from random import seed, sample
from bisect import bisect
#Create some fake data
seed(37)
data = dict((u, u/10.) for u in sample(xrange(50), 25))
keys = data.keys()
keys.sort()
print keys
def interp(t):
i = bisect(keys, t)
k = keys[max(0, i-1)]
return data[k]
for i in xrange(50):
print i, interp(i)
輸出
[2, 4, 8, 10, 14, 15, 19, 21, 22, 23, 26, 27, 29, 30,
32, 33, 34, 35, 37, 38, 39, 42, 43, 44, 48]
0 0.2
1 0.2
2 0.2
3 0.2
4 0.4
5 0.4
6 0.4
7 0.4
8 0.8
9 0.8
10 1.0
11 1.0
12 1.0
13 1.0
14 1.4
15 1.5
16 1.5
17 1.5
18 1.5
19 1.9
20 1.9
21 2.1
22 2.2
23 2.3
24 2.3
25 2.3
26 2.6
27 2.7
28 2.7
29 2.9
30 3.0
31 3.0
32 3.2
33 3.3
34 3.4
35 3.5
36 3.5
37 3.7
38 3.8
39 3.9
40 3.9
41 3.9
42 4.2
43 4.3
44 4.4
45 4.4
46 4.4
47 4.4
48 4.8
49 4.8
(I手動包裹的keys
輸出,使其更容易,而不水平滾動閱讀)。
你會通過重新編寫插補功能的身體在一條線得到微小加速:
def interp(t):
return data[keys[max(0, bisect(keys, t)-1)]]
它更可讀,恕我直言,但速度差可以值得它如果函數被調用了很多。
謝謝!不幸的是,它看起來像'scipy.filtfilt'不接受生成器,所以我仍然需要構建一個數組。我認爲在這一點上,我應該只花了一大筆錢,看看是否能工作沒有擊中醇」 OOM殺,因爲我害怕任何東西都不會變成一個真正的DIY解決方案,其中SciPy的不能幫助我了。 –
經過一些頭部劃傷後,如果點比「間隔」密集得多,它看起來像是發生器失敗。如果您嘗試'數據集= [[1,1],[2,2],[3,3],[4,4]]',然後'step_interpolate(數據集,3)'將給出'[[1,1],[ 4,2],[7,3],[10,4]]。與我的案件不相關,但這是一個重要的警告。 –
關於第一點:您可以在調用任何數組數據結構('np.array'或其他?)的過程中將調用包裝爲'step_interpolate(iter(data),interval)'。你失去了內存優勢,但保持速度優勢。關於第二點:好的電話,我會添加關於包裝密度警告的評論。如果你願意,我也可以解決這個問題。 – Julian