将字符串数组与2D数组匹配

时间:2019-10-31 15:19:36

标签: python arrays python-2.7 numpy

我有一个1D个字符串数组(gene_name_list)。我需要在另一个2D数组(fully_split)中找到第一个数组的每个字符串都存在的行。当然,我可以像这样解决暴力问题:

longest_gene_name = len(max(gene_name_list, key=len))
ensembl_list = np.full((len(gene_name_list)), '', dtype='U{}'.format(longest_gene_name))
for idx, gene_name in enumerate(gene_name_list):  
    for row in fully_split:                       
        if gene_name in row:                      
            ensembl_list[idx] = row[0]

但是花费的时间太长,我需要更快的解决方案。

row[0]包含我要映射到的特殊符号。因此,如果找到一个字符串,它将在row[1:]部分中找到,然后我将使用row[0]。不相关,但需要澄清。

2 个答案:

答案 0 :(得分:1)

分开执行时间,我认为您发布的蛮力方法与您用文字描述的方式不符:

  

我需要在另一个2D数组中找到第一个数组的每个字符串所在的行。

您的代码充其量只能找到2D数组的行中存在至少一维数组的字符串的所有行。

下面的代码执行您使用正则表达式用语言询问的内容。

import re

pattern = r'*'.join(map(re.escape, np.sort(gene_name_list)))
rows = [''.join(np.sort(x)) for x in fully_split]
res = [re.search(pattern, r) for r in rows]

由于顺序不相关,因此按字典顺序对gene_name_list进行排序,并使用正则表达式特殊字符'*'作为分隔符来连接字符串。这是将要搜索的模式。
然后,再次按字典顺序对2D数组fully_split的每一行进行排序,并将字符串连接在一起以形成单个字符串。在每一行上进行正则表达式搜索,以检查是否存在匹配项。

res是一个列表,对于未找到匹配项且对应的None是匹配项的那些行,您得到MatchObject

这说明了这个概念。为了更接近您的预期结果(存储行的第一个元素的位置),将最后一行替换为:

res = [l[0] if re.search(pattern, r) else None for r, l in zip(rows, fully_split)]

答案 1 :(得分:1)

根据您的描述,我做出了两个假设:
-2d数组为矩形(即不是df %>% group_by(vec) %>% filter( n()>4, entropy(table(!!sym(var_name)))>0 ) ),因为否则NumPy性能将毫无用处。
-dtype=object,因为您的代码示例包含len(fully_split) == len(gene_name_list),并且ensembl_list[idx] = row[0]来自idx

gene_name_list