Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何比较两个字符串的numpy数组;在;运算符使用数组广播获取布尔数组?_Python_Arrays_String_Numpy_Array Broadcasting - Fatal编程技术网

Python 如何比较两个字符串的numpy数组;在;运算符使用数组广播获取布尔数组?

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,

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,  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)