Python 查找序列的出现次数

Python 查找序列的出现次数,python,numpy,Python,Numpy,我正在寻找一种有效的方法(可能是numpy?)来计算2D数组中数字序列的出现次数 e、 g 将输出结果3。 三向嵌套循环选项很清楚,但可能存在更好的方法?谢谢 KMP搜索 尝试使用此代码并对其进行编辑以搜索矩阵的每个向量: 这是一个KMP(Knuth Morris Pratt)python函数,用于在文本或列表中查找模式。您可以通过创建搜索模式的shift数组一次,然后在每个1D子数组上运行其余的算法来稍微优化它 备选方案 将数组转换为字符串表示形式并计算字符串中出现的次数如何 repr(yo

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

e、 g

将输出结果3。 三向嵌套循环选项很清楚,但可能存在更好的方法?
谢谢

KMP搜索

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

这是一个KMP(Knuth Morris Pratt)python函数,用于在文本或列表中查找模式。您可以通过创建搜索模式的
shift
数组一次,然后在每个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

显示嵌套循环代码?直观地说,这听起来比使用整数数组更糟糕(因为数字的内部表示形式与字符串相比),在整数数组中搜索整数子数组也是O(n)。虽然我们不能实现比O(n)更好的结果,但我希望可能存在基于库的函数。你是对的,但我找不到任何这样的整数序列搜索库。对于这个案例,我的解决方案又快又脏。这是一篇很棒的文章,也是一个很好的解决方案。谢谢该解决方案有一个缺陷,即在count_seq_occ([1,2,3],[1,2],[3]])上返回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