我有一个具有不同长度字符串元素的NumPy数组:
array(['*,V*,UV,**,a2*,IR' , 'SB*,V*,UV,**,*,a2*,IR' , '*,V*,a2*' , ...])
每个元素都是一组用逗号分隔的缩写。如何找到其中一个缩写相等的元素(及其索引)**(双星号)?
答案 0 :(得分:2)
就像你在普通的python中一样:
for elem in array:
if '**' in elem.split(','):
# do something with elem
或者如果你想要一个列表:
[elem for elem in array if '**' in elem.split(',')]
或者,您可以对测试函数进行矢量化:
In [1]: import numpy as np
In [2]: a = np.array(['*,V*,UV,**,a2*,IR' , 'SB*,V*,UV,**,*,a2*,IR' , '*,V*,a2*'])
In [3]: def test(elem):
...: return '**' in elem.split(',')
...:
In [4]: vtest = np.vectorize(test)
In [5]: vtest(a)
Out[5]: array([ True, True, False], dtype=bool)
In [6]: a[vtest(a)]
Out[6]:
array(['*,V*,UV,**,a2*,IR', 'SB*,V*,UV,**,*,a2*,IR'],
dtype='|S21')
答案 1 :(得分:2)
首先,numpy数组对于你正在做的事情来说不是一个好的数据结构。
你要么使用固定长度的字符串数组(内存效率低,但速度快)或对象数组(对于许多短字符串来说都是无效的,并且通常很慢)。与numpy对象数组相比,列表更灵活(并且在python中迭代更快)选项。
你很可能会更好地使用字符串列表。
但是,如果您确实想使用numpy字符串数组,可以使用vectorized string operations in np.char
。
在您的情况下,您需要使用find
(in
运算符不会在此处工作,原因与您必须(x > 5) & (y > 5)
而不是(x > 5) and (y > 5)
相同用于numpy数组的布尔比较。)
例如:
import numpy as np
x = np.array(['*,V*,UV,**,a2*,IR' , 'SB*,V*,UV,**,*,a2*,IR' , '*,V*,a2*'],
dtype=str)
print np.char.find(x, '**') != -1