2017-04-21 1 views
0

は、私は、そのインデックス次のように整列された2つの時間配列を有する言う:インデックス

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と整列されることを意味します(t1が最初の3つの増分でt2より高速であることを意味する)。

予想される出力は次のようになります。

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](2回記録されません)とy[:,2]です。それは私には重複削除の問題と同様のようですが、私はどのように知りません。

申し訳ありませんが、私は適切なタイトルを考えて論理を正確に説明するのはちょっと難しいです。助けてくれてありがとう。

+1

「t1_ind」の滞在で* 3 *しないでください。 – 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

関連する問題