2016-08-17 8 views
1

文字列(または数値ベクトル)内の特定のパターンのすべての出現のインデックスを見つける必要があります。例えば、ブールリスト(データフレーム)与えられた:matlabish "strncmp" in python

z = 
15 False 
16 False 
17 False 
18 False 
19 False 
20 False 
21 False 
22 False 
23 False 
24  True 
25  True 
26  True 
27 False 
28 False 
29 False 
30 False 
31 False 
32 False 
33 False 
34 False 
35 False 
36  True 
37 False 
38 False 
39 False 
40  True 
41 False 
42 False 
43 False 
44 False 
45  True 
46  True 
47  True 
48 False 
49 False 

私はこの例では、行に3「真」のすべての出現のインデックスを返す関数に興味が、私はインデックスを取得する必要が

>> result = some_function(z) 

>> print result 

>> [24, 45] 

matlabでは、strcmpという関数を使うのは簡単ですが、これは私が必要とするものです。 Pythonにも同様の機能があると確信しています。

私は 'if ['True', 'True', 'True'] in z:....を使用しようとしましたが、間違っています。

UPD Iは、任意のデータ型で動作し、このような問題を非常に簡単で一般的な解決策を見つけた:「sub_array」が大きいアレイ「large_array」に見出さなければならないパターンである

def find_subarray_in_array(sub_array, large_array): 
    large_array_view = as_strided(large_array, shape=(len(large_array) - len(sub_array) + 1, len(sub_array)), strides=(large_array.dtype.itemsize,) * 2) 
    return where(numpy.all(large_array_view == sub_array, axis=1))[0] 

答えて

1

私はあなたの入力がリストされていることを、ここで仮定している:

inds = 
[15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 
31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 
47, 48, 49] 
bools = 
[False,False,False,False,False,False,False,False,False, True, True, 
True,False,False,False,False,False,False,False,False,False, True, 
False,False,False, True,False,False,False,False, True, True, True, 
False,False] 

あなたは、必要な比較が、その後行われ

pattern = [True, True, True] 

パターン[真、真、真]をチェックします:

[inds[i] for i in range(len(bools)) if bools[i:i+len(pattern)] == pattern ] 

戻り値:

[24、45]

+0

@ arnoldklein、このアプローチはあなたのために働くのですか? –

+0

@ RahukMadhavan、そうですが、理想的には、 "inds"を明示的に使用すべきではありません。基本的に、True/Falseの1Dimリスト(INDなし)を指定すると、インデックスを返す必要があります。しかし、ありがとう、私はあなたの助けに感謝します。 –

+0

インデックスだけが必要な場合は、inds [i]をiと置き換えてください。 –

1

これはリストの内包表記を使用して行うことができますが、あなたが操作をベクトル化することができ、具体的という、numpyの配列やパンダのデータフレームを使用する利点の多くを失いました。より良いアプローチは、numpy.correlateを使用することです。これにより、2つの配列を比較してどの程度一致しているかを確認することができます。これを使用して、ターゲット(配列3つのTrueの値)が配列自体と完全に一致するすべての場所を見つけることができます(相関は3なので、3つの要素が一致します)。これは相関の中心を見つけます。開始を見つけるには、結果から1を引く必要があります。だから、これはあなたが(indsvalsがnumpyの配列であると仮定して)やりたいことになります。

targ = [True, True, True] 
corr = np.correlate(vals.astype('int'), targ, mode='same') 
matches = np.where(corr == len(targ))[0]-len(targ)//2 
result = inds[matches] 

をインデックスは常にシーケンシャルになる場合(例えば13,14,15,16,...など)、あなたはこれを簡素化することができます。

targ = [True, True, True] 
corr = inds[np.correlate(vals.astype('int'), targ, mode='same') == len(targ)]-len(targ)//2 
+0

非常にきれい!ありがとう! –