我有两个名为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。
某些背景信息:
基本上,我想检查A和B是否将数据聚集到相同的集群中。我不确定我是否可以简单地比较A [i]和B [i]。
答案 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()转换数组到列表的开销是多少?