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