在python中,我有一个形状为n*2的数组(其中n是一个正整数)。本质上,这是一个对数组。我想删除这个数组中的所有镜像对。例如,下面的数组A的形状是10*2。这对[0,55]和[55,0]将构成A中的一个这样的镜像对,我希望在这两个镜像对中保留一个。在
A = np.array([[ 0, 55], [ 5, 25], [12, 62], [27, 32], [25, 73],
[55, 0], [25, 5], [62, 12], [32, 27], [99, 95]])
对于上述示例,我希望结果数组如下所示:
^{pr2}$因为有6个唯一对(排除4个镜像对之后)。在
我意识到我可以使用两个嵌套的for循环来实现这一点,但是我希望使用最快的方法来实现这一点,因为对于手头的实际问题,我将处理巨大的数组。我会很感激你的帮助。在
如果您使用的是纯python列表,请尝试以下代码。在
我假设对的顺序无关紧要(例如:[1,2]=[2,1])。如果是这种情况,可以翻转所有对,以便第一个数字始终小于第二个数字。在
变成
^{pr2}$然后,您可以按第一个数字,然后第二个数字对所有对进行排序:
最后,您可以遍历列表并删除任何重复的对。 如果使用高效的排序算法,比如mergesort,整个过程将有O(n*log(n))的工作,这比O(n^2)的工作(嵌套for循环所得到的结果)要好得多。在
神秘的一句话:
把它分成几个步骤。。。在
首先,创建一个沿第二个轴排序的副本。在已排序的数组中,我们要删除重复的行。在
^{pr2}$numpy.unique()
可用于查找数组的唯一元素,但它仅适用于一维数据。因此,我们将创建b
的一维视图,其中每一行都成为一个包含两个字段的结构。定义所需的新数据类型的一种方法是将其作为字符串:b
是一个结构化数组;它是a
的一维视图:现在我们使用
numpy.unique()
来找到b
的唯一元素:接下来,使用原始数组
A
的数据类型创建u
的视图。这将是一维的:最后,重塑
v
以恢复二维数组:相关问题 更多 >
编程相关推荐