2016-03-07 157 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