python中的matlabish“strncmp”

时间:2016-08-17 09:27:28

标签: python dataframe strcmp

我需要在字符串(或数字向量)中找到特定模式的所有出现的索引。例如,给定布尔列表(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

我对一个函数感兴趣,该函数返回一行中所有出现的三个'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”中找到的模式。

2 个答案:

答案 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]

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

pattern = [True, True, True]

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

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

返回:

  

[24,45]

答案 1 :(得分:1)

虽然这可以使用列表推导来完成,但是你失去了使用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