在numpy数组中查找包含子字符串的项?

在numpy数组中查找包含子字符串的项?,numpy,where,python-3.4,string-comparison,Numpy,Where,Python 3.4,String Comparison,我试图在数组中查找包含np.where和in条件的子字符串的条目: import numpy as np foo = "aa" bar = np.array(["aaa", "aab", "aca"]) np.where(foo in bar) 这只返回一个空数组。 为什么会这样? 还有好的替代方案吗 我们可以使用来查找foo字符串在条的每个元素中的位置,如果找不到,将返回-1。因此,它可以通过检查find输出中的-1来检测每个元素中是否存在foo。最后,我们将使用np.flatnonzero

我试图在数组中查找包含np.where和in条件的子字符串的条目:

import numpy as np
foo = "aa"
bar = np.array(["aaa", "aab", "aca"])
np.where(foo in bar)
这只返回一个空数组。
为什么会这样?
还有好的替代方案吗

我们可以使用来查找
foo
字符串在
的每个元素中的位置,如果找不到,将返回
-1
。因此,它可以通过检查
find
输出中的
-1
来检测每个元素中是否存在
foo
。最后,我们将使用
np.flatnonzero
来获得匹配的索引。所以,我们会有一个实现,就像这样-

np.flatnonzero(np.core.defchararray.find(bar,foo)!=-1)
样本运行-

In [91]: bar
Out[91]: 
array(['aaa', 'aab', 'aca'], 
      dtype='|S3')

In [92]: foo
Out[92]: 'aa'

In [93]: np.flatnonzero(np.core.defchararray.find(bar,foo)!=-1)
Out[93]: array([0, 1])

In [94]: bar[2] = 'jaa'

In [95]: np.flatnonzero(np.core.defchararray.find(bar,foo)!=-1)
Out[95]: array([0, 1, 2])

您尝试使用
np.where
的方式不正确。
np.where
的第一个参数应该是一个布尔数组,您只需传递一个布尔值即可

foo in bar
>>> False
np.where(False)
>>> (array([], dtype=int32),)
np.where(np.array([True, True, False]))
>>> (array([0, 1], dtype=int32),)
问题是numpy没有将中的
操作符定义为一个

你可以通过列表理解来完成你想要的事情

foo = 'aa'
bar = np.array(['aaa', 'aab', 'aca'])
out = [i for i, v in enumerate(bar) if foo in v]
# out = [0, 1]

bar = ['aca', 'bba', 'baa', 'aaf', 'ccc']
out = [i for i, v in enumerate(bar) if foo in v]
# out = [2, 3]

请看一些在
中使用
的示例:

In [19]: bar = np.array(["aaa", "aab", "aca"])

In [20]: 'aa' in bar
Out[20]: False

In [21]: 'aaa' in bar
Out[21]: True

In [22]: 'aab' in bar
Out[22]: True

In [23]: 'aab' in list(bar) 
当与数组一起使用时,它看起来像
中的
,就像数组是一个列表
ndarray
确实有一个
\uuuu contains\uuu
方法,因此
in
可以工作,但可能很简单

但在任何情况下,请注意,alist中的
不会检查子字符串。
strings
\uuuuu包含子字符串测试,但我不知道有哪个内置类将测试向下传播到组件字符串

正如
Divakar
所示,存在一组numpy函数,这些函数将字符串方法应用于数组的各个元素

In [42]: np.char.find(bar, 'aa')
Out[42]: array([ 0,  0, -1])
文档字符串:
此模块包含一组用于矢量化字符串的函数 操作和方法。
defchararray
的首选别名是
numpy.char

对于这样的操作,我认为
np.char
的速度与:

In [49]: np.frompyfunc(lambda x: x.find('aa'), 1, 1)(bar)
Out[49]: array([0, 0, -1], dtype=object)

In [50]: np.frompyfunc(lambda x: 'aa' in x, 1, 1)(bar)
Out[50]: array([True, True, False], dtype=object)

进一步的测试表明,
ndarray
\uuuuuuuuuuuuuuuuuuuuu
在阵列的
平面版本上运行-也就是说,形状不会影响其行为。

您也可以这样做:

mask = [foo in x for x in bar]  
filter = bar[ np.where( mask * bar != '') ]

这很好用。非常感谢你!但是出于好奇,你知道为什么np.where中的in条件不起作用吗?@SiOx AFAIK
foo
作为一个NumPy数组在
中不起作用。
中的
用于Python列表等。如果这有意义的话?
中的
可以与数组一起工作,也就是说
ndarray
有一个
\uuuuuuuuuuu
方法。但其行为与列表类似。
np.char.find
是此函数的简写形式。只有当其中没有空格时,它才部分起作用。如果将元素“aaa”和“aab”用于上面的情况(在最前面有空间),它将不起作用,欢迎使用堆栈溢出!虽然这个答案可以解决这个问题,但它并不试图回答为什么原始代码不工作的问题。你能把你的问题也修改一下解释一下吗?谢谢