我在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
算法来做到这一点。有更好的模块吗?
答案 0 :(得分:4)
在切片数组上使用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]])
答案 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])
作为索引的参数。