假设我有以下数组:
array([2, 0, 0, 1, 0, 1, 0, 0])
我如何得到我有值序列出现的索引:[0,0]
?因此,这种情况下的预期输出为:[1,2,6,7]
。
编辑:
1)请注意,[0,0]
只是一个序列。它可以是[0,0,0]
或[4,6,8,9]
或[5,2,0]
,任何东西。
2)如果我的数组被修改为:array([2, 0, 0, 0, 0, 1, 0, 1, 0, 0])
,则具有相同序列的[0,0]
的预期结果将是[1,2,3,4,8,9]
。
我在找一个NumPy的捷径。
3条答案
按热度按时间ndh0cuux1#
嗯,这基本上是一个
template-matching problem
,在图像处理中经常出现。这篇文章中列出了两种方法:基于NumPy和OpenCV(cv 2)。**方法#1:**使用NumPy,可以在输入数组的整个长度上创建一个
2D
滑动索引数组。因此,每一行将是元素的滑动窗口。接下来,将每行与输入序列匹配,这将为向量化解决方案带来broadcasting
。我们查找所有True
行,这些行表明它们是完美匹配的行,因此将是匹配的起始索引。最后,使用这些索引,创建一个索引范围,扩展到序列的长度,以给予我们所需的输出。实施将是-**方法#2:**在OpenCV(cv 2)中,我们有一个针对
template-matching
的内置函数:cv2.matchTemplate
。使用这个,我们将有开始匹配的索引。其余步骤与前一种方法相同。下面是cv2
的实现:样品运行
测试
看起来基于纯NumPy的是最安全和最快的!
pod7payv2#
我已经使用Divakar的解决方案很长一段时间了,它工作得很好。非常感谢您!然而,几天前,我需要一些更快的某个项目。使用strides https://numpy.org/doc/stable/reference/generated/numpy.ndarray.strides.html可以节省大量内存,因为它会创建一个“假副本”,numexpr https://github.com/pydata/numexpr的速度大约是numpy的两倍,但即使没有numexpr,它也相当快
rekjcdws3#
我发现最简洁、直观和通用的方法是使用正则表达式。