在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]])

对于上述示例,我希望结果数组如下所示:
B = np.array([[ 0, 55], [ 5, 25], [12, 62], [27,  32], [25, 73], [99,95])

因为有6个唯一的对(排除4个镜像对之后)。
我知道我可以使用两个嵌套for循环来实现这一点,但是我希望使用尽可能快的方法来实现这一点,因为对于手头的实际问题,我将处理巨大的数组。我会感谢你的帮助。

最佳答案

一句隐晦的话:

In [301]: A
Out[301]:
array([[ 0, 55],
       [ 5, 25],
       [12, 62],
       [27, 32],
       [25, 73],
       [55,  0],
       [25,  5],
       [62, 12],
       [32, 27],
       [99, 95]])

In [302]: np.unique(np.sort(A, axis=1).view(','.join([A.dtype.char]*2))).view(A.dtype).reshape(-1, 2)
Out[302]:
array([[ 0, 55],
       [ 5, 25],
       [12, 62],
       [25, 73],
       [27, 32],
       [95, 99]])

把它分成几步。。。
首先,创建一个沿着第二轴排序的副本。在排序数组中,我们要删除重复的行。
In [303]: a = np.sort(A, axis=1)

In [304]: a
Out[304]:
array([[ 0, 55],
       [ 5, 25],
       [12, 62],
       [27, 32],
       [25, 73],
       [ 0, 55],
       [ 5, 25],
       [12, 62],
       [27, 32],
       [95, 99]])

numpy.unique()可用于查找数组的唯一元素,但它仅适用于一维数据。因此,我们将创建一个b的一维视图,其中每一行成为一个具有两个字段的结构。定义新数据类型的一种方法是将其定义为字符串:
In [305]: dt = ','.join([A.dtype.char]*2)

In [306]: dt
Out[306]: 'l,l'

b是一个结构化数组;它是a的一维视图:
In [307]: b = a.view(dt)

In [308]: b
Out[308]:
array([[( 0, 55)],
       [( 5, 25)],
       [(12, 62)],
       [(27, 32)],
       [(25, 73)],
       [( 0, 55)],
       [( 5, 25)],
       [(12, 62)],
       [(27, 32)],
       [(95, 99)]],
      dtype=[('f0', '<i8'), ('f1', '<i8')])

现在我们使用numpy.unique()查找b的唯一元素:
In [309]: u = np.unique(b)

In [310]: u
Out[310]:
array([( 0, 55), ( 5, 25), (12, 62), (25, 73), (27, 32), (95, 99)],
      dtype=[('f0', '<i8'), ('f1', '<i8')])

接下来,使用原始数组的数据类型创建u的视图。这将是一维的:
In [311]: v = u.view(A.dtype)

In [312]: v
Out[312]: array([ 0, 55,  5, 25, 12, 62, 25, 73, 27, 32, 95, 99])

最后,重塑A以恢复二维数组:
In [313]: w = v.reshape(-1, 2)

In [314]: w
Out[314]:
array([[ 0, 55],
       [ 5, 25],
       [12, 62],
       [25, 73],
       [27, 32],
       [95, 99]])

关于python - Python |删除阵列中的镜像对,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44037156/

10-11 17:04