Python 检查两个np数组中是否有相同的元组

Python 检查两个np数组中是否有相同的元组,python,arrays,numpy,numpy-ndarray,Python,Arrays,Numpy,Numpy Ndarray,我有两个数组,其中有多个np数组,包含(x,y)中点的元组 A1=数组([数组[(x1,y1),(x2,y2)…],[数组[(x1,y1),(x2,y2)…]) A2=数组([数组[(x1,y1),(x2,y2)…],[数组[(x1,y1),(x2,y2)…]) 我想检查A1中一个数组中的元组是否存在于A2中的数组中。 我尝试了np.isin(A1[j],A2[j2]),但即使它们有公共元素,我也得到了false。 如果我使用np.isin((x1,y1),A2[j2]),我分别得到值的true

我有两个数组,其中有多个np数组,包含(x,y)中点的元组

A1=数组([数组[(x1,y1),(x2,y2)…],[数组[(x1,y1),(x2,y2)…])

A2=数组([数组[(x1,y1),(x2,y2)…],[数组[(x1,y1),(x2,y2)…])

我想检查A1中一个数组中的元组是否存在于A2中的数组中。 我尝试了np.isin(A1[j],A2[j2]),但即使它们有公共元素,我也得到了false。 如果我使用np.isin((x1,y1),A2[j2]),我分别得到值的true,但它不将元素作为元组计算,而是分别查找x1和y2的匹配

list1=[(1,2),(2,2),(3,6)]
ar1=np.empty(len(list1), dtype=object)
ar1[:]=list1

list2=[(1,2),(3,2),(5,4)]
ar2=np.empty(len(list2), dtype=object)
ar2[:]=list2
我在两个np数组(如A1和A2)中有多个数组(如ar1和ar2)

In [319]: ar1                                                                                 
Out[319]: array([(1, 2), (2, 2), (3, 6)], dtype=object)
In [320]: ar2                                                                                 
Out[320]: array([(1, 2), (3, 2), (5, 4)], dtype=object)
使用isin:

In [325]: np.isin(ar1,ar2)                                                                    
Out[325]: array([False, False, False])
我认为isin的相关部分是:

        mask = np.zeros(len(ar1), dtype=bool)
        for a in ar2:
            mask |= (ar1 == a)
        return mask

In [326]: [ar1==a for a in ar2]                                                               
/usr/local/bin/ipython3:1: DeprecationWarning: elementwise comparison failed; this will raise an error in the future.
  #!/usr/bin/python3
Out[326]: [False, False, False]
但是,让我们尝试一个“广播”比较(它似乎很好地处理了元组相等):

对象数据类型数组包含对Python对象的引用,同样的Python列表。数组的相等性测试必须使用对象本身的相等性测试。这提供了很多通用性,但没有速度

===

将数组转换为二维整数数据类型:

In [329]: arr1=np.stack(ar1)                                                                  
In [330]: arr1                                                                                
Out[330]: 
array([[1, 2],
       [2, 2],
       [3, 6]])
In [331]: arr2=np.stack(ar2)                                                                  

In [333]: arr1[:,None,:]==arr2[None,:,:]                                                      
Out[333]: 
array([[[ True,  True],
        [False,  True],
        [False, False]],

       [[False,  True],
        [False,  True],
        [False, False]],

       [[False, False],
        [ True, False],
        [False, False]]])
In [334]: (arr1[:,None,:]==arr2[None,:,:]).all(axis=-1)                                       
Out[334]: 
array([[ True, False, False],
       [False, False, False],
       [False, False, False]])

这并不能回答你的问题,但为什么你不拥有一个普通的多维数组呢?这些真的是元组还是自定义的数据类型?你能提供一个实际的MCVE吗?就像在代码中构造一个你想要处理的精确类型和数据类型的样本数组一样?数组中的元组,dtype=object看看
np.isin
;它有一个
object
dtype数组的特例。它没有做任何快速/奇特的编译代码。我想你最好把它们当作列表而不是对象数组来处理。你有没有关于如何用dtype=int32解决这个问题的技巧,也许可以在其他矩阵中构造数据。ThanksI添加了一个2d整数等价物
In [329]: arr1=np.stack(ar1)                                                                  
In [330]: arr1                                                                                
Out[330]: 
array([[1, 2],
       [2, 2],
       [3, 6]])
In [331]: arr2=np.stack(ar2)                                                                  

In [333]: arr1[:,None,:]==arr2[None,:,:]                                                      
Out[333]: 
array([[[ True,  True],
        [False,  True],
        [False, False]],

       [[False,  True],
        [False,  True],
        [False, False]],

       [[False, False],
        [ True, False],
        [False, False]]])
In [334]: (arr1[:,None,:]==arr2[None,:,:]).all(axis=-1)                                       
Out[334]: 
array([[ True, False, False],
       [False, False, False],
       [False, False, False]])