我有两个大型的二维数组,我想找出它们的集合差异,将它们的行作为元素。在matlab中,此代码将是setdiff(A,B,'rows')。数组足够大,我认为明显的循环方法花费的时间太长。

最佳答案

这应该有效,但由于正在创建的视图的MergeSort不可用,目前在1.6.1中已损坏。它在1.7.0版之前的版本中工作。这应该是最快的方法,因为视图不需要复制任何内存:

>>> import numpy as np
>>> a1 = np.array([[1,2,3],[4,5,6],[7,8,9]])
>>> a2 = np.array([[4,5,6],[7,8,9],[1,1,1]])
>>> a1_rows = a1.view([('', a1.dtype)] * a1.shape[1])
>>> a2_rows = a2.view([('', a2.dtype)] * a2.shape[1])
>>> np.setdiff1d(a1_rows, a2_rows).view(a1.dtype).reshape(-1, a1.shape[1])
array([[1, 2, 3]])

您可以在Python中执行此操作,但速度可能很慢:
>>> import numpy as np
>>> a1 = np.array([[1,2,3],[4,5,6],[7,8,9]])
>>> a2 = np.array([[4,5,6],[7,8,9],[1,1,1]])
>>> a1_rows = set(map(tuple, a1))
>>> a2_rows = set(map(tuple, a2))
>>> a1_rows.difference(a2_rows)
set([(1, 2, 3)])

关于python - 在Python中查找两个大型数组(矩阵)之间的集合差异,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11903083/

10-11 23:09
查看更多