查找序列的出现次数

时间:2018-04-13 07:55:43

标签: python numpy

我正在寻找一种有效的方式(可能是numpy?)来计算2D数组中一系列数字的出现次数。

e.g

count_seq_occ([2,3],
          array([[ 2,  3 ,  5,  2,  3],
                [  5,  2,  3],
                [  1]]))

将输出结果3。 三通嵌套循环选项很明确,但也许存在更好的方法?
谢谢

2 个答案:

答案 0 :(得分:1)

EDITED

KMP搜索

尝试使用此代码并对其进行编辑以搜索矩阵的每个向量: the docs

这是一个用于在文本或列表中查找模式的KMP(Knuth-Morris-Pratt)python函数。您可以通过创建搜索模式的$regex数组一次,然后在每个1D子数组上运行算法的其余部分来稍微优化它。

<强>替代

如何将数组转换为字符串表示并计算字符串中的出现次数?

shifts

注意:您应该真正格式化表示或计算子字符串以匹配相同的样式。例如,有时一个numpy数组的repr()会返回这样的内容:“1。,2.,3。”,你可能想以某种方式修复它。

或者你可以展平数组并将所有行连接成一个字符串,但要小心并在每一行后添加一个额外的唯一字符。

关于如何将其转换为字符串,该方法可能会有所不同,但它应该足够快。在字符串中搜索子字符串是O(n)时间,因此您不必担心这一点。不使用此方法的唯一可能原因是,如果您不希望在数组非常大的情况下分配临时字符串对象。

答案 1 :(得分:1)

这是一种方式,但我希望有更好的解决方案。如果你向我们展示你的嵌套循环并提供一些基准测试数据会很有帮助。

from itertools import chain

x = [2, 3]

A = np.array([[  2,  3,  5,  2,  3],
              [  5,  2,  3],
              [  1]])

arr = list(chain.from_iterable(A))
res = sum(arr[i:i+len(x)] == x for i in range(len(arr)))  # 3