2017-04-21 62 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