按重复列值

时间:2018-06-18 20:15:59

标签: python python-3.x numpy matrix multidimensional-array

我在numpy.ndarray中有一个类似于此的大型数据集:

array([[ -4,   5,   9,  30,  50,  80],
       [  2,  -6,   9,  34,  12,   7],
       [ -4,   5,   9,  98, -21,  80],
       [  5,  -9,   0,  32,  18,   0]])

我想删除重复的行,其中第0列,第1列,第2列和第5列相等。即在上面的矩阵中,响应将是:

-4, 5, 9, 30, 50, 80
2, -6, 9, 34, 12, 7
5, -9, 0, 32, 18, 0

numpy.unique做了非常相似的事情,但它只在所有列(轴)上找到重复项。我只想要特定的列。如何通过numpy来解决这个问题?我找不到任何体面的numpy算法来做到这一点。有更好的模块吗?

3 个答案:

答案 0 :(得分:4)

在切片数组上使用np.uniquereturn_index param超过axis=0,这为我们提供了唯一的索引,将每一行视为一个实体。然后可以将这些索引用于行索引到原始数组中以获得所需的输出。

因此,以a作为输入数组,它将是 -

a[np.unique(a[:,[0,1,2,5]],return_index=True,axis=0)[1]]

示例运行以分解步骤并希望明确 -

In [29]: a
Out[29]: 
array([[ -4,   5,   9,  30,  50,  80],
       [  2,  -6,   9,  34,  12,   7],
       [ -4,   5,   9,  98, -21,  80],
       [  5,  -9,   0,  32,  18,   0]])

In [30]: a_slice = a[:,[0,1,2,5]]

In [31]: _, unq_row_indices = np.unique(a_slice,return_index=True,axis=0)

In [32]: final_output = a[unq_row_indices]

In [33]: final_output
Out[33]: 
array([[-4,  5,  9, 30, 50, 80],
       [ 2, -6,  9, 34, 12,  7],
       [ 5, -9,  0, 32, 18,  0]])

答案 1 :(得分:1)

Pandas通过pd.DataFrame.drop_duplicates提供此功能。但是,方便的语法是以性能为代价的。

import pandas as pd
import numpy as np

A = np.array([[ -4,   5,   9,  30,  50,  80],
              [  2,  -6,   9,  34,  12,   7],
              [ -4,   5,   9,  98, -21,  80],
              [  5,  -9,   0,  32,  18,   0]])

res = pd.DataFrame(A)\
        .drop_duplicates(subset=[0, 1, 2, 5])\
        .values

print(res)

array([[-4,  5,  9, 30, 50, 80],
       [ 2, -6,  9, 34, 12,  7],
       [ 5, -9,  0, 32, 18,  0]])

答案 2 :(得分:0)

您可以使用np.take方法(https://docs.scipy.org/doc/numpy-1.14.0/reference/generated/numpy.take.html)从您关注的数组中获取唯一的列,然后使用return_index=True的唯一方法。

>>> arr = np.array([[ -4,   5,   9,  30,  50,  80],
...        [  2,  -6,   9,  34,  12,   7],
...        [ -4,   5,   9,  98, -21,  80],
...        [  5,  -9,   0,  32,  18,   0]])
>>> relevant_columns = np.take(arr, [0,1,2,5], axis=1)
>>> np.unique(relevant_columns, axis=0, return_index=True)
(array([[ 2, -6,  9,  7],
       [ 5, -9,  0,  0],
       [-4,  5,  9, 80]]), array([1, 3, 0]))

然后,您可以再次使用原始numpy数组np.take()。传递array([1, 3, 0])作为索引的参数。