Python 如何比较两个字符串的numpy数组;在;运算符使用数组广播获取布尔数组?
Python允许简单检查一个字符串是否包含在另一个字符串中:Python 如何比较两个字符串的numpy数组;在;运算符使用数组广播获取布尔数组?,python,arrays,string,numpy,array-broadcasting,Python,Arrays,String,Numpy,Array Broadcasting,Python允许简单检查一个字符串是否包含在另一个字符串中: 'ab' in 'abcd' 其计算结果为True 现在取一个numpy字符串数组,您可以执行以下操作: import numpy as np A0 = np.array(['z', 'u', 'w'],dtype=object) A0[:,None] != A0 生成布尔数组: array([[False, True, True], [ True, False, True], [ True,
'ab' in 'abcd'
其计算结果为True
现在取一个numpy
字符串数组,您可以执行以下操作:
import numpy as np
A0 = np.array(['z', 'u', 'w'],dtype=object)
A0[:,None] != A0
生成布尔数组:
array([[False, True, True],
[ True, False, True],
[ True, True, False]], dtype=bool)
现在让我们看另一个数组:
A1 = np.array(['u_w', 'u_z', 'w_z'],dtype=object)
我想检查A0
字符串不包含在A1
中的字符串中的位置,基本上创建了唯一的组合,但无论我如何编写索引,以下操作都不会生成布尔数组,只生成一个布尔数组:
A0[:,None] not in A1
我还尝试使用numpy.inad
和np.ndarray.\uuu包含\uuuu
,但这些方法似乎也不起作用
性能是这里的一个问题,所以我想充分利用numpy的
优化
我如何做到这一点
编辑:
我发现可以这样做:
fv = np.vectorize(lambda x,y: x not in y)
fv(A0[:,None],A1)
但正如numpy
文档所述:
提供矢量化功能主要是为了方便,而不是为了性能。该实现本质上是一个for循环
因此,这与在数组上循环相同,如果不使用显式或隐式for循环来解决这一问题,那将是一件好事。我们可以转换为
string
dtype,然后使用其中的一种
因此,使用,一种解决方案是-
np.char.count(A1.astype(str),A0.astype(str)[:,None])==0
替代使用-
再使用一次-
如果我们要将一个数组转换为str
dtype,我们可以跳过另一个数组的转换,就像内部一样。因此,最后一种方法可以简化为-
np.char.rfind(A1.astype(str),A0[:,None])==-1
样本运行-
In [97]: A0
Out[97]: array(['z', 'u', 'w'], dtype=object)
In [98]: A1
Out[98]: array(['u_w', 'u_z', 'w_z', 'zz'], dtype=object)
In [99]: np.char.rfind(A1.astype(str),A0[:,None])==-1
Out[99]:
array([[ True, False, False, False],
[False, False, True, True],
[False, True, False, True]], dtype=bool)
# Loopy solution using np.vectorize for verification
In [100]: fv = np.vectorize(lambda x,y: x not in y)
In [102]: fv(A0[:,None],A1)
Out[102]:
array([[ True, False, False, False],
[False, False, True, True],
[False, True, False, True]], dtype=bool)
有一个函数库,可以将字符串方法应用于array.Huh中的元素。对于这些函数中的任何一个,都没有记录允许字符串数组的
sub
参数。很高兴知道这是可行的。@DanielF是的,直到最近我才知道那些string
func在使用数组时允许广播。这是一个很好的解决方案,不过我在这里遇到了另一个问题。在所有这些之后,我需要连接字符串,并按照描述尝试np.core.defchararray.join
,但是当执行np.core.defchararray.join(['a','b'],['c','d'])
时,输出是数组(['c',d'],dtype='S1')
。你能告诉我为什么吗?@Khris那里的预期输出是什么?@Khris看起来不能用它来解决问题,因为它意味着用sep
连接每个字符串元素的每个字符。例如:使用np.core.defchararray.join('-',['abcd','xyz'])
,我们可以得到数组(['a-b-c-d','x-y-z']
。我猜这里可能是带有列表理解的普通Python代码。
np.char.rfind(A1.astype(str),A0[:,None])==-1
In [97]: A0
Out[97]: array(['z', 'u', 'w'], dtype=object)
In [98]: A1
Out[98]: array(['u_w', 'u_z', 'w_z', 'zz'], dtype=object)
In [99]: np.char.rfind(A1.astype(str),A0[:,None])==-1
Out[99]:
array([[ True, False, False, False],
[False, False, True, True],
[False, True, False, True]], dtype=bool)
# Loopy solution using np.vectorize for verification
In [100]: fv = np.vectorize(lambda x,y: x not in y)
In [102]: fv(A0[:,None],A1)
Out[102]:
array([[ True, False, False, False],
[False, False, True, True],
[False, True, False, True]], dtype=bool)