2013-12-12 60 views
0

這是一項任務。 我有一些要點: (所有如numpy的陣列)Python - 快速插值左值

xp = [1001, 1010, 1020, 1025] 
yp = [0, 0, 1, 1] # two values, if this helps 

我想插此爲numpy的陣列[1000,1001,... 1049,1050]。 所以,每個值等於區間的左側:

1000 - (some, doesn't matter) 
1001 - 0 
1002 - 0 (because left - in 1001 is 0) 
1003 - 0 
.... 
1009 - 0 
1010 - 0 
1011 - 0 
... 
1019 - 0 
1020 - 1 
1021 - 1 
... 
1024 - 1 
1025 - 1 
1026 - 1 
... 
1049 - 1 
1050 - 1. 

我不想做純Python,因爲這是慢慢的。 我可以使用numpy和scipy。我可以在沒有Cython或С++的情況下快速解決這個問題嗎?

+4

請告訴我們你之前已經做過什麼,說Python對此很慢。它似乎是列表建設,這是由Python處理得很好:) –

+0

這並不有趣。 Python循環總是比本地代碼慢,在numpy中工作。 – dondublon

回答

1

你應該expicetly指定端點:

>>> x = np.array(xp+[1051]) 

得到長度:

>>> np.diff(x) 
array([ 9, 10, 5, 26]) 

,並重復:

>>> np.repeat(yp, np.diff(x)) 
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
     1, 1, 1, 1]) 

或獲得的2-d數組:

>>> np.vstack([np.arange(x[0], x[-1]), np.repeat(yp, np.diff(x))]).T 
array([[1001, 0], 
     [1002, 0], 
     [1003, 0], 
     ... 
     [1020, 1], 
     ... 
     [1050, 1]]) 
+0

謝謝,清楚的解決方案! – dondublon