2017-04-21 61 views
0

说我有其索引排列如下两个时间序列:索引在对准时间序列索引重复的

import numpy as np  

t1_ind = np.array([ 1, 1, 1, 2, 3, 4, 5, 5, 6]) 
t2_ind = np.array([20, 21, 22, 23, 23, 24, 25, 26, 27]) 

这意味着该索引的t1 1与索引20,21和t2 22对准(意味着在前三个增量中t1t2快)等等。

预期输出应为:

y = np.array(([ 1, 2, 4, 5, 6], 
       [20, 23, 24, 25, 27])) 

的逻辑是“扫描” t1_indt2_ind和标记两者发病偏移每重复段的。在此示例中,条目1t1_ind之后是其副本,所以起始对记录在y[:,0]中,并且相应的偏移对是y[:,1]t1_ind中的下一个重复段分别以y[:,3]y[:,4]开始和结束。 t2_ind以同样的方式完成,结果对是y[:,1](不会被记录两次)和y[:,2]。在我看来,类似于重复删除问题,但我不知道如何。

对不起,对于我来说,想想一个合适的标题并简单地解释逻辑是相当困难的。谢谢你的帮助。

+1

应该在'不* 3 * t1_ind'留? – Psidom

+0

@Psidom 3不重复,并且不标记偏移量(对于't2_ind'中的23,[4,24]) – Francis

回答

2

根据您设置的条件,您可以创建一个布尔切片,您可以传递给两个数组。由于没有任何东西出现在第一个元素之前,我们将一直保留这些元素您可以通过减去被移位了1的数组的切片来检查第一个之后的重复元素。对这两个数组执行此操作将为您提供布尔数组以用作切片。

array_slice = np.concatenate((
    np.array([True]), 
    ((t1_ind[1:] - t1_ind[:-1]) != 0) & 
     (t2_ind[1:] - t2_ind[:-1]) != 0) 
    )) 

array_slice 
# returns: 
array([ True, False, False, True, False, True, True, False, True], dtype=bool) 

t1_ind[array_slice] 
t2_ind[array_slice] 
# returns: 
array([1, 2, 4, 5, 6]) 
array([20, 23, 24, 25, 27]) 
+0

谢谢,它很聪明! – Francis

+0

没问题。请记住将问题标记为完整。 – James