gpt4 book ai didi

python - 检查 numpy 数组中的所有行是否唯一

转载 作者:行者123 更新时间:2023-11-28 17:42:30 24 4
gpt4 key购买 nike

我有一个 4 列数组:

A=array([[100,1,500,1],
[100,1,501,1],
[101,1,501,1],
[102,2,502,2],
[500,1,100,1],
[100,1,500,1],
[502,2,102,2],
[502,1,102,1]])

我想提取唯一的行(或第一次出现的行)和这样的行,即对于行 i,没有其他行 j数组,其中 A[i,:]==A[j,[2,1,0,3]](或第一次出现)。

所以对于数组 A,我想得到一个如下所示的数组:

B=array([[100,1,500,1],
[100,1,501,1],
[101,1,501,1],
[102,2,502,2],
[502,1,102,1]])

谢谢你的帮助!

最佳答案

A[np.unique(np.sort(A,1).view("int, int, int, int"), return_index=True)[1]]

步骤:

In [385]: A
Out[385]:
array([[100, 1, 500, 1],
[100, 1, 501, 1],
[101, 1, 501, 1],
[102, 2, 502, 2],
[500, 1, 100, 1],
[100, 1, 500, 1],
[502, 2, 102, 2],
[502, 1, 102, 1]])

我们可以通过简单地对每一行进行排序来消除交换第 0 列和第 2 列(A[i] = A[j, [2,1,0,3])的需要。我们不必担心交换第 1 列和第 3 列,因为对于 A 中的所有行,我们的第 1 列等于第 3 列:A[:, 1] == A[: , 3]

In [386]: As = np.sort(A,1)

In [387]: As
Out[387]:
array([[ 1, 1, 100, 500],
[ 1, 1, 100, 501],
[ 1, 1, 101, 501],
[ 2, 2, 102, 502],
[ 1, 1, 100, 500],
[ 1, 1, 100, 500],
[ 2, 2, 102, 502],
[ 1, 1, 102, 502]])

As(已排序数组)中查找唯一行。将其视为一个结构化数组,其中每一行都是一个元素(因为 np.unique 否则会首先展平数组)

In [388]: As.view('int, int, int, int')
Out[388]:
array([[(1, 1, 100, 500)],
[(1, 1, 100, 501)],
[(1, 1, 101, 501)],
[(2, 2, 102, 502)],
[(1, 1, 100, 500)],
[(1, 1, 100, 500)],
[(2, 2, 102, 502)],
[(1, 1, 102, 502)]],
dtype=[('f0', '<i8'), ('f1', '<i8'), ('f2', '<i8'), ('f3', '<i8')])

In [389]: u, i = np.unique(As.view('int, int, int, int'), return_index=True)

In [390]: i
Out[390]: array([0, 1, 2, 7, 3])

并使用它们从原始数组 A 中获取在 As 中唯一的行:

In [391]: A[i]
Out[391]:
array([[100, 1, 500, 1],
[100, 1, 501, 1],
[101, 1, 501, 1],
[502, 1, 102, 1],
[102, 2, 502, 2]])

关于python - 检查 numpy 数组中的所有行是否唯一,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22339015/

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