我想确定我的numpy向量needle是否以切片或连续子向量的形式出现在另一个向量haystack中。

我想要一个函数find(needle, haystack)当且仅当存在可能的整数索引p和q这样needle等于haystack[p:q]时返回true,其中“等于”表示元素在所有位置都相等。

例:

find([2,3,4], [1,2,3,4,5]) == True
find([2,4], [1,2,3,4,5]) == False  # not contiguous inside haystack
find([2,3,4], [0,1,2,3]) == False  # incomplete


在这里,我使用列表来简化图示,但实际上它们将是numpy向量(一维数组)。

对于Python中的字符串,等效操作很简单:它是in"bcd" in "abcde" == True



关于尺寸的附录。

亲爱的读者,您可能会被类似外观的问题所吸引,例如testing whether a Numpy array contains a given rowChecking if a NumPy array contains another array。但是我们可以忽略这种相似性,因为没有考虑到尺寸。

向量是一维数组。用numpy术语,长度为N的向量将具有.shape == (N,);其形状的长度为1。

其他提到的问题通常是在二维矩阵中寻找行的精确匹配。

我正在尝试像窗口一样沿一维干草堆的同一轴滑动一维针,直到整个针都与通过窗口可见的干草堆部分匹配。

最佳答案

如果可以很好地创建两个数组的副本,则可以使用Python in运算符处理字节对象:

def find(a, b):
  return a.tobytes() in b.tobytes()

print(
    find(np.array([2,3,4]), np.array([1,2,3,4,5])),
    find(np.array([2,4]),   np.array([1,2,3,4,5])),
    find(np.array([2,3,4]), np.array([0,1,2,3])),
    find(np.array([2,3,4]), np.array([0,1,2,3,4,5,2,3,4])),
)

# True False False True

关于python - 我可以找出一个numpy向量是否作为另一个的切片出现吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60001444/

10-14 18:26