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

时间:2016-03-07 04:52:34

标签: python arrays numpy

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

以下是一个例子。
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中有一个匹配列表。
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个聚类的所有向量。
  4. 基本上,我想检查A和B是否将数据聚集到相同的集群中。我不确定我是否可以简单地比较A [i]和B [i]。

4 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分: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
>>> 

答案 2 :(得分:0)

从您的最新修改中可以看出,您的列表元素既不可清洗也不订购。一个更简单的解决方案是将你的numpy.ndarray更改为list然后你可以对这两个列表进行排序以便于比较。如果是Exit()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

答案 3 :(得分:0)

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

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

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