在numpy数组中查找包含子字符串的项?
我试图在数组中查找包含np.where和in条件的子字符串的条目:在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
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 AFAIKfoo
作为一个NumPy数组在中不起作用。
中的用于Python列表等。如果这有意义的话?
中的可以与数组一起工作,也就是说ndarray
有一个\uuuuuuuuuuu
方法。但其行为与列表类似。np.char.find
是此函数的简写形式。只有当其中没有空格时,它才部分起作用。如果将元素“aaa”和“aab”用于上面的情况(在最前面有空间),它将不起作用,欢迎使用堆栈溢出!虽然这个答案可以解决这个问题,但它并不试图回答为什么原始代码不工作的问题。你能把你的问题也修改一下解释一下吗?谢谢