我有一个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]
。不相关,但需要澄清。
答案 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