gpt4 book ai didi

python |删除阵列中的镜像对

转载 作者:行者123 更新时间:2023-11-28 19:53:32 24 4
gpt4 key购买 nike

在 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 的一维 View ,其中每一行都变成具有两个字段的单一结构。定义我们想要的新数据类型的一种方法是作为字符串:

In [305]: dt = ','.join([A.dtype.char]*2)

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

b 是结构化数组;它是 a 的一维 View :

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

接下来,使用原始数组A 的数据类型创建u 的 View 。这将是一维的:

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

最后,reshape v 恢复二维数组:

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 |删除阵列中的镜像对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44037156/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com