2017-05-14 83 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

它确实:-)熊猫也有效。为我节省了很多循环:-) –