2017-05-14 82 views
0

我有兩個數組中的數據對樣本。例如:重塑數據樣本

times = [0, 1, 3, 3.5, 5, 6] 
values = [1, 2, 3, 4, 5, 6] 

因此,在時間0時,值爲1,在時間1時爲2,依此類推。正如你所看到的,時間值不是固定的時間距離(儘管在所有情況下都是按照升序排列的)。我在尋找一種有效的方式對上述轉換成

times1 = [0, 1, 2, 3, 4, 5, 6] 
values = [1, 2, 2.5, 3, 4.333, 5, 6] 

這些值是根據該地塊從中間值計算:

enter image description here

當然,我可以做一個循環找到這些值並將它們填入目標數組中。但我不知道numpy是否有什麼「立即」做到這一點。

注:This與我想要的相似(雖然稍微有點瑣碎),所以我猜測沒有任何東西可用。但是誰知道。

+0

向我們展示如何在循環中執行此操作。 – hpaulj

+1

times1和值沒有相同數量的元素。看起來你正在尋找插值。 scipy有這個功能。隨着熊貓,它會更容易。 – ayhan

+0

@ayhan你說得對,對不起。 –

回答

1

隨着SciPy的,你可以使用interp1d

from scipy.interpolate import interp1d  
f = interp1d(times, values) 

f(times1) 
Out: 
array([ 1.  , 2.  , 2.5  , 3.  , 4.33333333, 
     5.  , 6.  ]) 

有了大熊貓,這也是可能的:

ser = pd.Series(values, index=times) 
ser2 = pd.Series(index=times1) 

ser.combine_first(ser2).interpolate(method='index').reindex(ser2.index) 
Out: 
0 1.000000 
1 2.000000 
2 2.500000 
3 3.000000 
4 4.333333 
5 5.000000 
6 6.000000 
dtype: float64 

combine_first取這兩個指數的聯合。內插是做這項工作的主要方法。由於您正在對索引進行線性插值,因此您需要通過method='index'

+0

我很想測試一下,但現在我得到'模塊'對象沒有'內插'屬性。只是使用點子來升級這似乎是在這種情況下推薦。否則這將正是我需要的。 –

+0

@ThomasKilian它似乎是在版本0.14中添加的。從scipy.interpolate導入interp1d工作? – ayhan

+1

它確實:-)熊貓也有效。爲我節省了很多循環:-) –