我有一个二维的numpy数组。我需要过滤掉重复的内容--如果一行中的任何一项在前一行中,那么它就被认为是重复的。
#i.e.:
arr =
array([[4580, 4581, 4657, 4658],
[4580, 4581, 4657, 4659], #-> duplicate because of 4580
[4650, 4652, 4654, 4655],
[4651, 4655, 4652, 4656]]) #-> duplicate because of 4652
#Output should be:
array([[4580, 4581, 4657, 4658],
[4650, 4652, 4654, 4655]])
下面的脚本给出了我对小输入的预期输出。然而,它在大数组上会阻塞。我相信有一种更简单,更有效的方法来做到这一点,但我似乎找不到它。
check = np.array([not(np.in1d(a, np.unique(arr[:i])).any()) for i,a in enumerate(arr)])
arr[check]
3条答案
按热度按时间qvtsj1bj1#
可以使用
np.unique
查找数组的唯一元素。传递参数return_index=True
返回唯一元素第一次出现的索引。请注意,由于unique
隐式展平数组,因此这些值是 flattened 数组中的索引。现在,我们要选择任何行,其中 * 所有 * 它的元素都在
unique_indices
数组中。首先,让我们创建一个数组,将扁平数组中的元素的索引Map到它在arr
中的位置:现在,让我们看看
unique_indices
中有哪些索引:最后,只选择
select_elem
的行,它们都是True
:使用它来索引数组,我们得到了想要的结果:
以下是性能随输入大小的变化:
Timeless's方法与您的方法(毫不奇怪)几乎相同,因为它具有相同的瓶颈,即在python中对数组进行迭代。我上面展示的pure-numpy方法运行速度明显更快。我没有对Yossi's方法计时,因为它给出了错误的结果。
xienkqul2#
以下是一个与您的方法一致的方法:
输出:
hyrbngr73#
输出:
EDITED:由于pranav注解。其想法是将所有行向上滚动一行,并在列维中迭代滚动。如果任何数字与上排的数字之一相同,则忽略该行。
修复了检查所有先前行的实现。