【问题标题】:Numpy: Search for an array A with same pattern in a larger array BNumpy:在更大的数组 B 中搜索具有相同模式的数组 A
【发布时间】:2017-10-21 16:33:16
【问题描述】:

我有两个 1D numpy 数组 A(small) 和 B(large)

A=np.array([6,7,8,9,10])

B=np.array([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,10])

我想检查我们是否在数组 B 中检测到数组 A 的元素是否以相同的顺序被检测到。 获取数组 B 的索引值,从我们检测到数组 A 的开始处

Index Value returned = 6

我们是否有任何内置的 numpy 函数来执行这样的操作?

【问题讨论】:

  • 只是为了检查 - 你的意思是它是否是一个精确的子数组......例如:如果B = [..., 6, 7, 8, 9, 11, 10] - 那是否匹配?
  • @JonClements 是的,你没看错。这正是我的意思。

标签: numpy


【解决方案1】:

我有时也遇到过这个问题。我认为特别是对于大型 numpy 数组来说,最快的方法是将它们转换为字符串,然后再执行。 这是我使用的代码:

b=np.array([6,7,8,9,10])    
a=np.array([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,10])
a.tostring().index(b.tostring())//a.itemsize

【讨论】:

  • 不错,临时修复。对于数组中的少量元素。我将处理数组中的大量元素。我怀疑这是否是一种有效的使用方法,首先查看需要转换为字符串并存储在虚拟内存中的数据量。
【解决方案2】:

我找到了一个不错的解决方案。

@EdSmith 在Finding Patterns in a Numpy Array 中提供

简而言之就是这个过程

  • 缩短被搜索数组的长度。(我的例子A)
  • 使用 np.where 和 np.all 检查正在搜索的数组的整个长度(我的示例 B)

这不是我的代码,而是可以在 about 链接中找到的代码,简单易行。我将对其进行一些更改以适合我上面的示例希望它可以帮助某人:)

感谢@EdSmith

import numpy as np

A=np.array([6,7,8,9,10])

B=np.array([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,10])

N = len(A)
possibles = np.where(B == A[0])[0]

solns = []
for p in possibles:
    check = B[p:p+N]
if np.all(check == A):
    solns.append(p)

print(solns)

输出

[6]

【讨论】:

    【解决方案3】:

    试试这个:

    import numpy as np
    A=np.array([6,7,8,9,10])
    B=np.array([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,10])
    r = np.ones_like(B)
    for x in range(len(A)):r*=np.roll((B==A[x]),-x)
    #first index, answer: /6/ 
    print(np.where(r)[0][0])
    

    【讨论】:

      猜你喜欢
      • 2012-10-22
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      • 2020-10-18
      • 2021-10-17
      • 1970-01-01
      • 2021-06-03
      • 1970-01-01
      相关资源
      最近更新 更多