Pythonic的方式来检查是否两个列表的列表是相等的
我有numpy数组列表的名为A和B的两个列表,我想检查A中的每个列表,B中存在的列表是相同(包含相同的数组)。Pythonic的方式来检查是否两个列表的列表是相等的
下面是一个例子。
A = [[np.array([5,2]),np.array([6,7,8])],[np.array([1,2,3])]]
B = [[np.array([1,2,3])],[np.array([6,7,8]),np.array([5,2])]]
基本上,我想知道是否有pythonic /优雅的方式来编写函数f(A,B)== True。
为什么它应该是真的?
A [0] = [np.array([5,2]),np.array([6,7,8])]。 B [1] = [np.array([6,7,8]),np.array([5,2])]
A [0]和B [1] ]都包含完全相同的一组矢量:np.array([6,7,8]),np.array([5,2])。
A [1] = [np.array([1,2,3])]。 B中有一个匹配列表。
B [0] = [np.array([1,2,3])]。
因此,返回True。
一些上下文:
- A和B是相同的数据的两个聚类。
- A和B具有相同数量的簇,所以A和B的长度相同。
- A [0]是表示属于A聚类中的第0个聚类的所有向量的数组列表。
基本上,我想检查A和B是否将数据聚集到相同的簇中。我不确定我是否可以简单比较A [i]和B [i]。
本来,我想知道如果有一个优雅,Python化的方式来检查,如果两个列表A和B分组的numpy的阵列到同一个列表,不分先后顺序的。我想避免将numpy数组转换为列表来进行比较。但是,根据我收到的回复,似乎将数组转换为列表是最优雅的方式。这里是我的代码中使用array.tolist()转换数组列表后:
for cluster in A:
if cluster not in B:
return False
return True
如果任何人有改进或批评,请评论。
另外,使用array.tolist()将数组转换为列表的开销是多少?
尝试以下操作:
all(A[i] == B[i] if len(B) == len(A) else False for i in range(len(B)))
>>> A = [[5, 2], [6, 7, 8]]
>>> B = [[5, 2], [6, 7, 8]]
>>> all(A[i] == B[i] if len(B) == len(A) else False for i in range(len(B)))
True
>>> A.append([56, 2])
>>> all(A[i] == B[i] if len(B) == len(A) else False for i in range(len(B)))
False
>>>
尝试使用numpy.array_equal, 你可以使用这样的代码:
>>> import numpy as np
>>> np.array_equal(np.array([[1,2],[2,1]]), np.array([[1,2],[2,1]]))
True
从你的最新修改它显然,你的列表元素既不可排序也不排序。更简单的解决方案是将numpy.ndarray更改为列表,然后可以对两个列表进行排序以便于比较。在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
我尝试了以下解决方案: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。 – mkim123