【问题标题】:Find array string sequence in another numpy array在另一个numpy数组中查找数组字符串序列
【发布时间】:2019-11-13 12:00:45
【问题描述】:

我有一个关于搜索数组的问题。我需要找到一些存储在数组中的字符串序列,例如它可能看起来像这样 数组1:

['818181' '747473' '747474' '636363' '767676' '737373' '727373' '373838'
 '697070' '686869' '115115115' '737474' '757575' '777777' '818181' '747473'
 '747474' '636363' '767676' '737373' '727373' '757575' '696969']

这是一个带有字符串的 numpy 数组。 Dtype显示它是S9。 然后我有另一个具有相同结构但更大的主阵列。我正在寻找最有效的方法来找到 array1 在主数组中开始的位置,所以就像我在 numpy 数组中寻找指定的模式一样。这些值重复,我需要找到完全相同的值。我一直在为此寻找最佳解决方案,但找不到任何有用的方法。主阵列非常大,我需要在 1 秒内获得阵列 1 的位置。我发现了一些关于在数组中查找序列的示例脚本,不幸的是这些都没有帮助我。大多数情况下,他们在小数组中找到一些整数值。我需要一些建议。

我尝试在 enumerate() 中使用 for i, e 遍历整个数组 所以一个元素看起来像这样 - '818181'。然后我在计算一行中的 23 个元素(在这个例子中)是否相同。但是当第 5 个元素出错时,我将不得不去我发现第 1 个的地方才能 100% 成功(因为模式可以相互叠加),而且速度非常慢。

主数组和array1类似,但是是1000x并且有更多的值

【问题讨论】:

    标签: python arrays numpy sequence


    【解决方案1】:

    一点也不;再看一遍。当您到达第 5 个元素时,您已经知道第 2、3、4 个元素 不是第一个元素,因此您只需从不匹配的元素重新开始。

    这是语法中一个众所周知的问题,可以用有限状态机处理。

    首先不要担心字符串的内容;重要的是您要找到一系列符号。每个“数字”字符串都是一个不同的符号。为方便起见,我们如下映射:

    '818181' => a
    '747473' => b
    '747474' => c
    etc.
    

    所以数组可以简化成这样:

     '818181' '747473' '747474' '636363' '767676' '737373' '727373' '373838'
      a        b        c        d        e        f        g        h
     '697070' '686869' '115115115' '737474' '757575' '777777' '818181' '747473'
      i        j        k           l        m        n        a        b
     '747474' '636363' '767676' '737373' '727373' '757575' '696969']
      c        d        e        f        g        m        o
    

    或者,作为一个单行序列:

      abcdefghijklmnabcdefgmo
    

    在您提到的情况下,b 不匹配,我们不必备份到输入的b 位置并重新开始;我们已经确定 bcd 匹配,它们 a,所以我们不备份:我们只是重新开始,将 a 与不匹配的项目进行比较'不匹配。

    碰巧的是,我们从不需要备份。在最坏的情况下,我们将继续检查匹配失败的位置,而不是目标字符串的开头。我们必须处理一个棘手的情况:中间字符串匹配。

    考虑当我们在靠近目标序列末尾的第二个m 处出现不匹配时会发生什么。在这种情况下,我们知道我们刚刚匹配了abcdefg,但当前符号不是 m ...但如果可能h。为了避免备份,我们利用部分匹配,并使用h 重新开始检查。

    要处理此算法,您需要对目标字符串进行一些预处理。创建第二个数组,保存目标字符串中每个位置的重启索引。为此,您只需检查它偏离自身正面的位置即可。对于您的示例,这很简单:o 是主字符串和移位字符串匹配多个字符的唯一位置,但在此位置不同。

      abcdefghijklmnabcdefgmo
      11111111111111111111181
    

    这会让你感动吗?

    【讨论】:

      【解决方案2】:

      您可以遍历 array1 中的每个值并使用np.where() 来获取主数组中值的索引。将索引添加到列表中,然后对列表进行排序。然后找到与数组 1 的长度匹配的索引的连续长度。

      例如:

      def consecutive(data, stepsize=1):
          return np.split(data, np.where(np.diff(data) != stepsize)[0]+1)
      
      index_list = []
      for val in array1:
          index_list.extend(list(np.where(main_array == val)))
      index_list.sort()
      
      for sequence in consecutive(index_list):
          if len(sequence) == len(array1):
              print(sequence)
      

      how to find the groups of consecutive elements from an array in numpy? 向@unutbu 致谢,用于连续功能。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-02
        • 2016-08-10
        • 1970-01-01
        • 2020-06-19
        • 1970-01-01
        • 2020-04-15
        相关资源
        最近更新 更多