检查两个数组列表是否相等的Python方法
我有两个名为A和B的numpy数组列表,我想检查A中的每个列表,B中是否存在相同的列表(包含相同的数组) 这里有一个例子。检查两个数组列表是否相等的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=[[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 一些背景:
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