如何通过正则表达式过滤numpy数组?

时间:2018-04-27 14:20:13

标签: python arrays numpy

我试图通过Python中的正则表达式过滤numpy数组,但是,我遇到了一个错误,其中没有匹配所有预期的值。

我正在使用的数据是一个不同长度的大型numpy数组。抢先使用正则表达式过滤器,我创建了一个特定长度的所有字符串的索引,我最终希望使用正则表达式过滤器对此索引进行子集化。

我创建了以下用于过滤此索引的函数:

# Remove all indices corresponding to peptides contaning Cs.
def remove_cs(peptide_arr, indices_arr):
    indices_peptide_arr = peptide_arr[indices_arr]
    r = re.compile(b'C')
    v_search = np.vectorize(lambda x: not bool(r.search(x, re.IGNORECASE)))
    indices_filter = v_search(indices_peptide_arr)
    filtered_indices_arr = indices_arr[indices_filter]
    return filtered_indices_arr

上述函数的目标是将作为输入给出的索引数组进行子集化,以便它只包含那些相应值不包含任何C的索引。作为输入,给出完整的未过滤肽阵列和选择索引阵列。这似乎可以过滤大多数所需的索引,但是,在检查过滤器时,一些选择似乎不匹配。例如,仍然返回与b'ACAAAAAA'对应的索引。更重要的是,似乎在所有正则表达式未命中的情况下,相应的肽包含C作为其前两个字符之一,我认为这对此错误很重要。

以下小示例脚本举例说明了该问题。虽然我希望只返回2(索引对应'AAAA'),但也返回6(索引对应'ACAA')。

peptide_list = ['AA', 'AAA', 'AAAA', 'AAAC', 'AACA', 'AACC', 'ACAA', 'ACAC', 'ACCC']
peptide_byte_list = [i.encode() for i in peptide_list]
peptide_arr = np.array(peptide_byte_list)
indices_arr = np.array([2, 3, 4, 5, 6, 7, 8])
print(remove_cs(peptide_arr, indices_arr))

我很感激有关为什么我的当前正则表达式会丢失在字符串的前两个字符内发生的任何匹配的任何见解。

1 个答案:

答案 0 :(得分:1)

编辑 search的方法形式不会带flags个参数,因此IGNORECASE(恰好等于2 })被解释为pos

将其移至compile来电,错误消失:

# Remove all indices corresponding to peptides contaning Cs.
def remove_cs(peptide_arr, indices_arr):
    indices_peptide_arr = peptide_arr[indices_arr]
    r = re.compile(b'C', re.IGNORECASE)
    v_search = np.vectorize(lambda x: not bool(r.search(x)))
    indices_filter = v_search(indices_peptide_arr)
    filtered_indices_arr = indices_arr[indices_filter]
    return filtered_indices_arr

print(remove_cs(peptide_arr, indices_arr))
# [2]