首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >按重复列值删除行

按重复列值删除行
EN

Stack Overflow用户
提问于 2018-06-18 20:15:58
回答 3查看 1.7K关注 0票数 3

我在numpy.ndarray中有一个类似于以下内容的大型数据集:

代码语言:javascript
复制
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列相等。例如,在上述矩阵表中,答复如下:

代码语言:javascript
复制
-4, 5, 9, 30, 50, 80
2, -6, 9, 34, 12, 7
5, -9, 0, 32, 18, 0

numpy.unique做一些非常类似的事情,但它只在所有列(轴)上找到重复。我只想要特定的专栏。如何才能在numpy中做到这一点呢?我找不到合适的numpy算法来做这件事。有更好的模块吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-06-18 20:20:58

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

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

代码语言:javascript
复制
a[np.unique(a[:,[0,1,2,5]],return_index=True,axis=0)[1]]

试运行来分解步骤,希望能把事情弄清楚-

代码语言:javascript
复制
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]])
票数 5
EN

Stack Overflow用户

发布于 2018-06-18 20:22:24

熊猫通过pd.DataFrame.drop_duplicates有这方面的功能。然而,方便的语法是以性能为代价的。

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2018-06-18 20:32:46

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

代码语言:javascript
复制
>>> 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])作为索引的参数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50916845

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档