我试图在一个名为values
的numpy
array
中找到模式。我想返回模式的起始索引位置。我知道我可以在每个元素上迭代并检查该元素和下一个元素是否与模式匹配,但是在一个非常低效的大型数据集上,我正在寻找更好的替代方案。
我有一个使用np.where
搜索单个值的工作解决方案,但是我无法让它与查找一个或两个数字一起工作。
示例:
import numpy as np
values = np.array([0,1,2,1,2,4,5,6,1,2,1])
searchval = [1,2]
print np.where(values == searchval)[0]
输出:
[]
预期产量:
[1, 3, 8]
这是一个使用where的直接方法。从查找匹配项的逻辑表达式开始:
它可以被概括为一个在多个
searchval
上操作的循环。正确的切片范围需要一些技巧。在另一个答案中建议的roll
可能更容易,但我怀疑有点慢。只要
searchval
比values
小,这种一般方法就应该是有效的。有一个np.in1d
进行这种匹配,但是有一个or
测试。所以不适用。但它也使用了这种迭代方法,即searchval
列表足够小。广义切片
我用中间体
np.s_
来观察切片,确保它们看起来合理。大步前进
一个高级技巧是使用
as_strided
构造“rolled”数组并对其执行2d==
测试。as_strided
很整洁但很棘手。要正确使用它,你必须了解步伐,并得到正确的形状。不能简单地使用
np.where
(假设这是找到元素的最佳方法),然后只检查满足第一个条件的模式。我想这就是工作:
相关问题 更多 >
编程相关推荐