O.r*_*rka 3 python indexing numpy substring where
我想在数组中找到包含子字符串的所有索引,在这种情况下它是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]
Run Code Online (Sandbox Code Playgroud)
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]])
Run Code Online (Sandbox Code Playgroud)
-1表示未找到的元素,0表示查找.
In [312]: np.where(np.char.find(A, 'contig')>=0)
Out[312]: (array([0, 1, 1, 2], dtype=int32), array([2, 2, 9, 2], dtype=int32))
In [313]: A[_]
Out[313]:
array(['contig_1758_2278_4341_-', 'contig_1758_2278_4341_-',
'contig_1297_3232_198298_+', 'contig_1281_415_1704_-'],
dtype='<U149')
Run Code Online (Sandbox Code Playgroud)
像这样的函数必须迭代元素,并应用相应的字符串方法,因此它们不像通常的numpy数字代码那么快,但它们比自己的迭代要容易得多.
np.vectorize或者np.frompyfunc也可以用于将函数应用于数组的每个元素.它们也会迭代,因此对于您自己的迭代而言并不是显着的加速.我仍然发现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))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1913 次 |
| 最近记录: |