我在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, 0numpy.unique做一些非常类似的事情,但它只在所有列(轴)上找到重复。我只想要特定的专栏。如何才能在numpy中做到这一点呢?我找不到合适的numpy算法来做这件事。有更好的模块吗?
发布于 2018-06-18 20:20:58
在切片数组上使用np.unique,return_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]])发布于 2018-06-18 20:22:24
熊猫通过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]])发布于 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中使用唯一的方法。
>>> 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])作为索引的参数。
https://stackoverflow.com/questions/50916845
复制相似问题