python中的matlabish“strncmp”

2024-03-28 17:03:29 发布

您现在位置: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

我感兴趣的是一个函数,它返回一行中所有出现的三个'True'的索引,在这个例子中,我应该得到索引

^{pr2}$

在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”中找到的模式。在


Tags: 函数字符串inviewfalsetruedataframelen
2条回答

我假设你的输入是列表:

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]

^{pr2}$

然后通过以下方法进行所需的比较:

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

退货:

[24, 45]

尽管可以使用列表理解来实现这一点,但是您失去了使用numpy数组或pandas数据帧的许多优势,特别是可以对操作进行矢量化。更好的方法是使用numpy.correlate,它允许您比较两个数组,以查看它们的匹配情况。您可以使用它来查找目标(由三个True值组成的序列)与数组本身完美匹配的所有位置(相关性是3,因此有3个元素匹配)。这将找到相关性的中心,因此如果要找到起点,则需要从结果中减去一个。因此这将执行您想要的操作(假设inds和{}是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,...),可以将其简化为:

^{pr2}$

相关问题 更多 >