使用正则表达式匹配图形间隔

Using Regex to match graph intervals

假设我有一个数字数组:arr=[1, 2, 3, 4, 5, 4, 3, 2, 1].

常规正则表达式有其基本的 units/literals 作为字符。我想知道是否有一种方法可以将 "objects" 作为对象 [a,b] 的基本单位。

现在我要回答问题,"does arr contain at least 2 intervals of length 3 that have positive gradients?"。我在想我可以通过用 [a,b] 对象替换字符来模仿正则表达式,其中 a 是间隔的大小, b 是该间隔上 运行 的函数( gradient_pos)。该函数将 return TrueFalse 取决于是否满足条件。例如,要回答上述问题,您将查询:

[3,gradient_pos]{2,}

您会看到语法遵循所有正则表达式规则,除了我们不是查看字符,而是查看有效计算为 TrueFalse[a,b] 个对象.这个想法是,正则表达式将尝试匹配满足 gradient_pos 的 2 个或更多长度为 3 的区间。那有意义吗?我知道这很抽象,但如果有人能帮助我实现这样的目标,我将不胜感激!

谢谢!

您可以将其视为正则表达式问题。所以你的数组会变成:

import numpy as np
arr=[1, 2, 3, 4, 5, 4, 3, 2, 1]
arr = np.array(arr)
arr_as_str=''.join(map(str,np.sign(arr[1:]-arr[:-1])+1))

我得到了不包括最后一个元素的梯度,并将 sign 函数从 (-1,+1) 移动到 (0,2)。这样做的原因是为了避免字符串表示中的减号。

所以现在您可以照常应用正则表达式匹配,其中:

  • 负梯度:0
  • 零梯度:1
  • 正梯度:2

您的“3 个连续正梯度”查询将如下所示:

matches=list(re.finditer('(?=(2{3}))',arr_as_str)) 

由于存在重叠的正则表达式匹配项,因此您必须像这样使用先行: Python regex find all overlapping matches?

您可以使用起始索引引用原始数组,而且您知道序列有多长:

matches[1].start()

我建议使用这种方法,因为您似乎对正则表达式很满意。但是,如果您有兴趣探索其他方法,我建议您查看 morphological filtering,这将是我的首选