如何在NumPy数组中查找元素的部分

时间:2014-02-01 19:56:47

标签: python numpy

我有一个具有不同长度字符串元素的NumPy数组:

array(['*,V*,UV,**,a2*,IR' , 'SB*,V*,UV,**,*,a2*,IR' , '*,V*,a2*' , ...])

每个元素都是一组用逗号分隔的缩写。如何找到其中一个缩写相等的元素(及其索引)**(双星号)?

2 个答案:

答案 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

在您的情况下,您需要使用findin运算符不会在此处工作,原因与您必须(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