2016-03-07 85 views
3

我有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。

一些上下文:

  1. A和B是相同的数据的两个聚类。
  2. A和B具有相同数量的簇,所以A和B的长度相同。
  3. A [0]是表示属于A聚类中的第0个聚类的所有向量的数组列表。

基本上,我想检查A和B是否将数据聚集到相同的簇中。我不确定我是否可以简单比较A [i]和B [i]。

回答

0

本来,我想知道如果有一个优雅,Python化的方式来检查,如果两个列表A和B分组的numpy的阵列到同一个列表,不分先后顺序的。我想避免将numpy数组转换为列表来进行比较。但是,根据我收到的回复,似乎将数组转换为列表是最优雅的方式。这里是我的代码中使用array.tolist()转换数组列表后:

for cluster in A: 
    if cluster not in B: 
     return False 
return True 

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

0

尝试以下操作:

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 
>>> 
+0

我尝试了以下解决方案: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

2

尝试使用numpy.array_equal, 你可以使用这样的代码:

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

从你的最新修改它显然,你的列表元素既不可排序也不排序。更简单的解决方案是将numpy.ndarray更改为列表,然后可以对两个列表进行排序以便于比较。在AB情况下,这意味着

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 

的你可以比较AB为:

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

对不起,如果我没有清楚地问这个问题。 np.array表示一个向量,因此np.array中元素的顺序很重要。所以C与A和B不同。 – mkim123

+0

@ mkim123根据您的澄清,我修改了我的答案。 – hashmuke