查找NumPy数组中包含子字符串的所有位置(最有效吗?)

2024-10-03 17:28:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我想找到一个数组中包含子字符串的所有索引,在本例中是substring = "contig_"。我开始逐行迭代,然后遍历数组中的每个元素,但这是它得到的最强大的力量。在

在numpy或scipy中是否有比暴力方法更快的函数?

A = np.array([['K00180:55:H3NHMBBXX:7:1101:30340:1068', '83',
        'contig_1758_2278_4341_-', '1487', '60', '140M', '=', '1334',
        '293', "=",
        '*', 'RG:Z:RG_0', 'MD:Z:23A30A85', 'NM:i:2\n'],
       ['K00180:55:H3NHMBBXX:7:1101:30340:1068', '163',
        'contig_1758_2278_4341_-', '1334', '60', '87M1I3M1D17M', '=',
        '1487', '293', "contig_1297_3232_198298_+",
        '*', 'RG:Z:RG_0', 'MD:Z:31G3G2G6T6C6A9C4T15^G17', 'NM:i:10\n'],
       ['K00180:55:H3NHMBBXX:7:1101:28026:1103', '83',
        'contig_1281_415_1704_-', '514', '60', '142M', '=', '396', '260', "=",
        '*', 'RG:Z:RG_0', 'MD:Z:11C130', 'NM:i:1\n']], 
      dtype='<U149')

for row in A:
    print(np.where(["contig_" in x for x in row])[0])

# [2]
# [2 9]
# [2]

Tags: 字符串in元素fornp数组substringmd
1条回答
网友
1楼 · 发布于 2024-10-03 17:28:24

np.char是一组函数,它们将字符串方法应用于像您这样的数组的元素。因此,使用find函数:

In [311]: np.char.find(A, 'contig')
Out[311]: 
array([[-1, -1,  0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1],
       [-1, -1,  0, -1, -1, -1, -1, -1, -1,  0, -1, -1, -1, -1],
       [-1, -1,  0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]])

-1表示未找到的元素,0或更大表示找到。在

^{pr2}$

像这样的函数必须迭代元素,并应用相应的string方法,因此它们的速度不如通常的numpy数字代码快,但是它们比自己迭代要容易得多。在


np.vectorize或{}也可用于对数组的每个元素应用函数。它们也是迭代的,所以在你自己的迭代中没有显著的加速。不过,我发现frompyfunc通常可以提供30%的加速。在

In [331]: f=np.frompyfunc(lambda x: x.find('contig'), 1,1)  # like char.find

In [332]: f=np.frompyfunc(lambda x: 'contig' in x, 1,1)  # your 'in'

In [333]: f(A)
Out[333]: 
array([[False, False, True, False, False, False, False, False, False,
        False, False, False, False, False],
       [False, False, True, False, False, False, False, False, False, True,
        False, False, False, False],
       [False, False, True, False, False, False, False, False, False,
        False, False, False, False, False]], dtype=object)

In [334]: np.where(f(A))
Out[334]: (array([0, 1, 1, 2], dtype=int32), array([2, 2, 9, 2], dtype=int32))

相关问题 更多 >