检查两个数组列表是否相等的Python方法

检查两个数组列表是否相等的Python方法,python,arrays,numpy,Python,Arrays,Numpy,我有两个名为A和B的numpy数组列表,我想检查A中的每个列表,B中是否存在相同的列表(包含相同的数组) 这里有一个例子。 A=[[np.数组([5,2]),np.数组([6,7,8]),[np.数组([1,2,3])] B=[[np.数组([1,2,3])],[np.数组([6,7,8]),np.数组([5,2])] 基本上,我想知道是否有一种pythonic/优雅的方法来编写f(a,B)=True的函数。 为什么应该是真的? [0]=[np.数组([5,2]),np.数组([6,7,8])。

我有两个名为A和B的numpy数组列表,我想检查A中的每个列表,B中是否存在相同的列表(包含相同的数组)

这里有一个例子。
A=[[np.数组([5,2]),np.数组([6,7,8]),[np.数组([1,2,3])]
B=[[np.数组([1,2,3])],[np.数组([6,7,8]),np.数组([5,2])]

基本上,我想知道是否有一种pythonic/优雅的方法来编写f(a,B)=True的函数。

为什么应该是真的?
[0]=[np.数组([5,2]),np.数组([6,7,8])。B中有一个匹配列表。
B[1]=[np.数组([6,7,8]),np.数组([5,2])]
A[0]和B[1]都包含完全相同的向量集:np.数组([6,7,8]),np.数组([5,2])。

[1]=[np.数组([1,2,3])。B中有一个匹配列表。
B[0]=[np.数组([1,2,3])。
因此,返回True

一些背景:

  • A和B是相同数据的两个聚类
  • A和B具有相同数量的簇,因此A和B具有相同的长度
  • [0]是表示属于A群集中第0个群集的所有向量的数组列表
  • 基本上,我想检查A和B是否将数据聚集到相同的集群中。我不确定是否可以简单地比较A[I]和B[I]。

    尝试以下方法:

    all(A[i] == B[i] if len(B) == len(A) else False for i in range(len(B)))
    

    尝试使用, 您可以使用如下代码:

    >>> import numpy as np
    >>> np.array_equal(np.array([[1,2],[2,1]]), np.array([[1,2],[2,1]]))
    True
    

    从您最近的修改可以明显看出,您的列表元素既不可散列也不可排序。一个更简单的解决方案是将numpy.ndarray更改为list,然后可以对这两个列表进行排序,以便于比较。在
    A
    B
    的情况下,这意味着

    In [141]: A_sorted_list = sorted([sorted([list(j) for j in i]) for i in A])
    In [142]: B_sorted_list = sorted([sorted([list(j) for j in i]) for i in B])
    
    然后对两个列表进行比较

    In [143]: all([all(i==j) for i, j in zip(A_sorted_list, B_sorted_list)])
    Out[143]: True
    
    如果将数组更改为列表有问题,则可以使用帮助器函数来比较集群:

    def compare_clusters(cluster_A, cluster_B):
        for aj in cluster_A:
            aj_included = any([all(bj==aj) if len(bj)==len(aj) else False  for bj in cluster_B])
            if not aj_included:
                return False
        return True
    
    您可以比较
    A
    B
    如下:

    In [149]: all([any([compare_clusters(ai, bi) for ai in A]) for bi in B])
    Out[149]: True
    

    最初,我想知道是否有一种优雅的python方法来检查两个列表A和B是否将numpy数组分组到相同的列表中,而不考虑顺序。我希望避免仅仅为了进行比较而将numpy数组转换为列表。然而,根据我收到的回复,将数组转换为列表似乎是最优雅的方式。下面是我使用array.tolist()将数组转换为列表后的代码:


    如果任何人有改进或批评,请评论
    另外,使用array.tolist()将数组转换为列表的开销是多少?

    如果我没有清楚地问这个问题,很抱歉。数组表示一个向量,因此数组中元素的顺序很重要。所以C不同于A和B。@mkim123我根据你的澄清修改了我的答案。我尝试了以下解决方案:A=[np.array([5,2])、np.array([6,7,8])、B=[np.array([6,7,8])、np.array([5,2])。然而,它返回False,而我希望它返回True。a和b都包含相同的向量,所以我想返回True。
    In [149]: all([any([compare_clusters(ai, bi) for ai in A]) for bi in B])
    Out[149]: True
    
    for cluster in A:
        if cluster not in B:
            return False
    return True