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 个元素匹配)。这找到了相关的中心,所以如果你想找到开始,你需要从结果中减去一个。所以这会做你想做的(假设 inds
和 vals
是 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
我需要找到字符串(或数值向量)中所有出现的特定模式的索引。例如,给定布尔列表 (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 个元素匹配)。这找到了相关的中心,所以如果你想找到开始,你需要从结果中减去一个。所以这会做你想做的(假设 inds
和 vals
是 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