python 中的 matlabish "strncmp"

matlabish "strncmp" in python

我需要找到字符串(或数值向量)中所有出现的特定模式的索引。例如,给定布尔列表 (DataFrame):

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

我对一个函数感兴趣,它 returns 连续出现三个 'True' 的索引,在这个例子中,我应该得到索引

>> result = some_function(z)

>> print result

>> [24, 45]

在 matlab 中,使用函数 strcmp 非常容易,它正是我需要的。我确信 Python.

中有类似的功能

我尝试使用'if ['True', 'True', 'True'] in z:....但我做错了。

UPD 我找到了一个非常简单和通用的解决此类问题的方法,它适用于任何数据类型:

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]

其中 "sub_array" 是应该在较大数组 "large_array" 中找到的模式。

我在这里假设您的输入是列表:

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]

然后您想要检查模式 [True, True, True]

pattern = [True, True, True]

然后通过以下方式完成所需的比较:

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

Returns:

[24, 45]

虽然这可以使用列表理解来完成,但是您失去了使用 numpy 数组或 pandas 数据帧的很多优势,特别是您可以向量化操作。更好的方法是使用 numpy.correlate,它允许您比较两个数组以查看它们的匹配程度。您可以使用它来查找您的目标(三个 True 值的序列)与数组本身完美匹配的所有位置(相关性为 3,因此 3 个元素匹配)。这找到了相关的中心,所以如果你想找到开始,你需要从结果中减去一个。所以这会做你想做的(假设 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