当前位置: 首页 > 面试题库 >

Python / NumPy第一次出现子数组

蓝夕
2023-03-14
问题内容

在Python或NumPy中,找出子数组首次出现的最佳方法是什么?

例如,我有

a = [1, 2, 3, 4, 5, 6]
b = [2, 3, 4]

找出b在a中出现的最快方法(运行时)是什么?我了解字符串非常简单,但是对于列表或numpy ndarray呢?

非常感谢!

[编辑]我更喜欢numpy解决方案,因为根据我的经验,numpy向量化比Python列表理解要快得多。同时,大数组很大,因此我不想将其转换为字符串。那将(太)长。


问题答案:

我假设您正在寻找特定于numpy的解决方案,而不是简单的列表理解或for循环。一种方法可能是使用滚动窗口技术来搜索适当大小的窗口。这是rolling_window函数:

>>> def rolling_window(a, size):
...     shape = a.shape[:-1] + (a.shape[-1] - size + 1, size)
...     strides = a.strides + (a. strides[-1],)
...     return numpy.lib.stride_tricks.as_strided(a, shape=shape, strides=strides)
...

然后你可以做类似的事情

>>> a = numpy.arange(10)
>>> numpy.random.shuffle(a)
>>> a
array([7, 3, 6, 8, 4, 0, 9, 2, 1, 5])
>>> rolling_window(a, 3) == [8, 4, 0]
array([[False, False, False],
       [False, False, False],
       [False, False, False],
       [ True,  True,  True],
       [False, False, False],
       [False, False, False],
       [False, False, False],
       [False, False, False]], dtype=bool)

为了使它真正有用,您必须使用沿轴1减小它all

>>> numpy.all(rolling_window(a, 3) == [8, 4, 0], axis=1)
array([False, False, False,  True, False, False, False, False], dtype=bool)

然后您可以使用它,但是您将使用布尔数组。一种获取索引的简单方法:

>>> bool_indices = numpy.all(rolling_window(a, 3) == [8, 4, 0], axis=1)
>>> numpy.mgrid[0:len(bool_indices)][bool_indices]
array([3])

对于列表,您可以调整这些滚动窗口迭代器之一以使用类似的方法。

对于 非常 大的数组和子数组,可以这样保存内存:

>>> windows = rolling_window(a, 3)
>>> sub = [8, 4, 0]
>>> hits = numpy.ones((len(a) - len(sub) + 1,), dtype=bool)
>>> for i, x in enumerate(sub):
...     hits &= numpy.in1d(windows[:,i], [x])
... 
>>> hits
array([False, False, False,  True, False, False, False, False], dtype=bool)
>>> hits.nonzero()
(array([3]),)

On the other hand, this will probably be slower. How much slower isn’t clear
without testing; see Jamie‘s
answer for another memory-conserving option that has to check false positives.
I imagine that the speed difference between these two solutions will depend
heavily on the nature of the input.




 类似资料:
  • 我有一个1D数组在Numpy和我想找到的索引的位置,其中一个值超过了Numpy数组中的值。 例如。 在中查找超过值的位置。

  • 问题内容: 有没有比numpy 2D数组更好的方法来计算给定行出现在numpy 2D数组中的次数 问题答案: 一种简单的方法是- 考虑到内存效率,这是一种将每行作为网格上的索引元组并假设输入中为正数的一种方法- 这 是一篇讨论与之相关的各个方面的文章。 注意: 使用计数布尔值可能要快得多,而不是使用求和。因此,请考虑将其用于上述两个方法。 这是一个快速的运行时测试-

  • 问题内容: 我有一些示例字符串。如何用空字符串替换长字符串中第一次出现的该字符串? 问题答案: 字符串replace()函数可以完美解决此问题: string.replace(s,old,new [,maxreplace]) 返回字符串s的副本,其中所有出现的子字符串old都替换为new。如果给出了可选参数maxreplace,则替换第一个出现的maxreplace。

  • 问题内容: 我很少使用SQL,也无法在档案库中找到任何类似的内容,所以我问一个简单的查询问题:我需要一个查询,该查询返回 personID 且仅返回第一个 seeedTime 记录: 想要的结果: 那就是我做过的和失败的: PS:注意SQL CE 4 问题答案: 如果您的seenTime增加,随着seenID增加: 更新另一种情况: 如果不是这种情况,并且您确实希望SeenedTime与最小的se

  • 本文向大家介绍Python中首次出现真数,包括了Python中首次出现真数的使用技巧和注意事项,需要的朋友参考一下 在本文中,我们需要在给定的数字列表中找到第一个出现的非零数字。 与枚举和下一个 我们起诉枚举以获取所有元素的列表,然后应用下一个函数以获取第一个非零元素。 示例 输出结果 运行上面的代码给我们以下结果- 与下一个和过滤器 将next和filter条件以及lambda表达式应用于条件不

  • 有人能帮我为这个双链接列表写一个RemoveFirstOccurse方法吗? 它删除目标数据第一次出现的节点。搜索从头部开始。如果目标数据不在列表中,那么列表保持不变。最后一个节点的下一个字段值为null。没有尾部引用。 到目前为止,我写了这样的东西,但是当删除列表中没有的字符串时,我得到了一个空指针异常。我已经标记了NPE发生的地方。如果你能帮助找出原因,或者如果你有一个完全不同的方法来工作,那

  • 一、题目 在字符串中找出第一个只出现一次的字符。 二、解题思路 第一种:直接求解: 从头开始扫描这个字符串中的每个字符。当访问到某字符时拿这个字符和后面的每个字符相比较,如果在后面没有发现重复的字符,则该字符就是只出现一次的字符。如果字符串有n个字符,每个字符可能与后面的O(n)个字符相比较,因此这种思路的时间复杂度是O(n^2)。 第二种:记录法 由于题目与字符出现的次数相关, 我们是不是可以统

  • NowCoder 题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次,找出这两个数。 解题思路 两个不相等的元素在位级表示上必定会有一位存在不同,将数组的所有元素异或得到的结果为不存在重复的两个元素异或的结果。 diff &= -diff 得到出 diff 最右侧不为 0 的位,也就是不存在重复的两个元素在位级表示上最右侧不同的那一位,利用这一位就可以将两个元素区分开来。 // ja