【问题标题】:remove duplicate 2D numpy.array删除重复的 2D numpy.array
【发布时间】:2019-05-20 19:30:51
【问题描述】:

我想删除以下数组中的一些“重复”项:

arr = array([[1, 2, 3, 0, 1],
             [0, 0, 0, 1, 0]])

在上述数组中,arr[:, 0]arr[:, 3]arr[:, 4] 应被视为重复项。最后,我想要这个结果:

arr = array([[1, 2, 3],
             [0, 0, 0]])

【问题讨论】:

  • 您能补充一些信息吗?你真正的问题有多大?条目的类型和范围是什么?像 (1, 1, 0) 和 (0, 1, 0) 这样的列是否可能,它们是否被视为相等?
  • @PaulPanzer 对此感到抱歉。数组非常大,像 2*10000。并且有很多这样的数组。每列,如 [1,2,3],等于其排列(如 [1,3,2],[2,1,3],[2,3,1],[3,2,1],[ 3,1,2])。
  • 最好更新问题,因为不是每个人都阅读 cmets。此外,为了找到最佳解决方案,几乎任何信息都是有用的:不仅是总大小,而且实际形状 nrows x ncols(或者您的意思是 2 x 10000?)。同样,一列是否可以有重复值,如果是,应该如何处理?最后,数据是什么 dtype?因为如果在您的示例中它们是小的整数优化是可用的。

标签: python arrays python-3.x numpy numpy-ndarray


【解决方案1】:

如果您能够使用 Pandas,您可以使用 np.sortpd.DataFrame.duplicated 来创建布尔索引器:

import numpy as np
import pandas as pd

arr = np.array([[1, 2, 3, 0, 1],
                [0, 0, 0, 1, 0]])

arr_dups = pd.DataFrame(np.sort(arr.T)).duplicated().values
res = arr[:, ~arr_dups]

print(res)

array([[1, 2, 3],
       [0, 0, 0]])

【讨论】:

  • 感谢您的回复。但我对熊猫并不熟悉。我可以使用 numpy 来完成这个吗?
  • @fanronghong,可能,但可能就语法而言并不那么简单。请保持问题的开放性,看看是否会出现更好的解决方案。
【解决方案2】:

你可以这样做:

import numpy as np

arr = np.array([[1, 2, 3, 0, 1],
             [0, 0, 0, 1, 0]])
arr_sorted = arr.copy() # copy the array so your input is not sorted
arr_sorted.sort(0) # sort row such as duplicates are in the same order
_, indices = np.unique(arr_sorted, axis=1, return_index=True) # find unique indices
arr_unique = arr[:,indices] # select indices
print(arr_unique)

# [[1 2 3]
#  [0 0 0]]

【讨论】:

  • 只是为了缩短你的代码,你可以直接这样做:arr[:,np.unique(np.sort(arr,axis=0), axis=1, return_index=True)[1]]
猜你喜欢
  • 2020-02-06
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 2020-06-16
  • 1970-01-01
  • 2014-04-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多