繁体   English   中英

查找序列出现的次数

[英]Find the number of occurrences of a sequence

我正在寻找一种有效的方法(也许是numpy?)来计算2D数组中数字序列出现的次数。

例如

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

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

EDITED

KMP搜索

尝试使用此代码并对其进行编辑以搜索矩阵的每个向量: http : //code.activestate.com/recipes/117214/

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

替代

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

repr(your_array).count("2, 3")

注意:您应该真正格式化表示形式或计数的子字符串以使其都匹配相同的样式。 例如,有时numpy数组的repr()会在内部返回以下内容:“ 1,。,2.,3。”,并且您可能希望以某种方式解决此问题。

另外,您可以展平数组并将所有行连接为字符串,但是要小心,并在每行之后添加一个额外的唯一字符。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM