2017-04-21 5 views
0

que j'ai deux séquences temporelles dont les indices sont alignés de la manière suivante:indexation de duplicata des indices de séries temporelles aligné

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]) 

ce qui signifie que l'indice 1 de t1 soit aligné avec l'index 20, 21 et 22 de t2 (impliquant que t1 est plus rapide que t2 dans les trois premiers incréments) et ainsi de suite.

La sortie attendue devrait être:

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

La logique est de « scanner » t1_ind et t2_ind et marquer à la fois le début et décalage de tous les segments en double. Dans cet exemple, l'entrée 1 dans t1_ind est suivie de sa copie, de sorte que la paire de début est enregistrée dans y[:,0] et la paire de décalage respective est y[:,1]. Le segment dupliqué suivant dans t1_ind commence et se termine par y[:,3] et y[:,4], respectivement. t2_ind est fait de la même manière, les paires résultantes sont y[:,1] (ne sera pas enregistré deux fois si) et y[:,2]. Il me semble similaire avec un problème de duplication-suppression mais je ne sais pas comment.

Désolé, il m'est difficile de penser à un titre correct et d'expliquer la logique en un mot. Merci pour toute aide.

+1

Ne devrait pas * 3 * dans 't1_ind' rester? – Psidom

+0

@Psidom 3 n'est pas dupliqué et ne marque pas le décalage (pour 23 dans 't2_ind', [4, 24]) – Francis

Répondre

2

Vous pouvez créer une découpe booléenne que vous pouvez transmettre aux deux tableaux, en fonction des conditions que vous avez définies. Puisque rien ne vient avant les premiers éléments, nous garderons toujours ceux-ci. Vous pouvez vérifier les éléments répétés après le premier en soustrayant des tranches des tableaux qui sont décalés de 1. Si vous faites cela pour les deux tableaux, vous obtiendrez le tableau booléen à utiliser comme tranche.

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

Merci, c'est intelligent! – Francis

+0

Pas de problème. N'oubliez pas de marquer la question comme complète. – James