如果数组元素出现多次,则过滤二维numpy数组

如果数组元素出现多次,则过滤二维numpy数组,numpy,multidimensional-array,Numpy,Multidimensional Array,我想删除在二维数组中共享一个元素的行。例如: array = [0 1] [2 3] [4 0] [0 4] filtered_array = [2 3] 编辑:列位置无关紧要这里有一个使用- 展示各种场景的示例运行 案例#1:跨相同和不同列的多个匹配 In [313]: arr Out[313]: array([[0, 1], [2, 3], [4, 0], [0, 4]]) In [314]:

我想删除在二维数组中共享一个元素的行。例如:

array = [0 1]
        [2 3]
        [4 0]
        [0 4]

filtered_array = [2 3]

编辑:列位置无关紧要

这里有一个使用-

展示各种场景的示例运行

案例#1:跨相同和不同列的多个匹配

In [313]: arr
Out[313]: 
array([[0, 1],
       [2, 3],
       [4, 0],
       [0, 4]])

In [314]: filter_rows(arr)
Out[314]: array([[2, 3]])
In [325]: arr
Out[325]: 
array([[ 0,  1],
       [ 2,  3],
       [ 8, 10],
       [ 7,  0]])

In [326]: filter_rows(arr)
Out[326]: 
array([[ 2,  3],
       [ 8, 10]])
案例2:沿相同列匹配

In [319]: arr
Out[319]: 
array([[ 0,  1],
       [ 2,  3],
       [ 8, 10],
       [ 0,  4]])

In [320]: filter_rows(arr)
Out[320]: 
array([[ 2,  3],
       [ 8, 10]])
案例3:沿不同列匹配

In [313]: arr
Out[313]: 
array([[0, 1],
       [2, 3],
       [4, 0],
       [0, 4]])

In [314]: filter_rows(arr)
Out[314]: array([[2, 3]])
In [325]: arr
Out[325]: 
array([[ 0,  1],
       [ 2,  3],
       [ 8, 10],
       [ 7,  0]])

In [326]: filter_rows(arr)
Out[326]: 
array([[ 2,  3],
       [ 8, 10]])
案例4:同一行中的匹配

In [331]: arr
Out[331]: 
array([[ 0,  1],
       [ 3,  3],
       [ 8, 10],
       [ 7,  0]])

In [332]: filter_rows(arr)
Out[332]: array([[ 8, 10]])

这只是@Divakar令人印象深刻的解决方案的替代方案。这种方法无论如何都是糟糕的(尤其是效率),但对于非numpy大师来说可能更容易理解

import numpy as np

def filter_(x):
    unique = np.unique(x) # 1
    unique_mapper = [np.where(x == z)[0] for z in unique] # 2
    filtered_unique_mapper = list(map(lambda x: x if len(x) > 1 else [], unique_mapper)) # 3
    all = np.concatenate(filtered_unique_mapper) # 4
    to_delete = np.unique(all) # 5
    return np.delete(x, all, axis=0)

# 1 get global unique values
# 2 for each unique value: get all rows with this value
#   -> multiple entries for one unique value: row's collide!
# 3 remove entries from above, if only <= 1 rows hold that unique value
# 4 collect all rows, which collided somehow
# 5 remove multiple entries from above
将numpy导入为np
def过滤器(x):
唯一=np.唯一(x)#1
唯一映射器=[np.其中(x==z)[0]表示唯一中的z]#2
过滤的唯一映射器=列表(映射(lambda x:x如果len(x)>1 else[],唯一映射器))#3
all=np.concatenate(过滤的_唯一的_映射器)#4
删除=np.唯一(全部)#5
返回np.delete(x,all,axis=0)
#1获取全局唯一值
#2对于每个唯一值:获取具有此值的所有行
#->一个唯一值的多个条目:行的碰撞!

#3删除上面的条目,如果只共享同一列,还是我们还需要检查其他列?检查两列。如果您只使用两列数组,请选择“是”。数据是以示例的形式出现的,只是要长得多。如果一行中的两个元素是相同的,我们会根据这一点过滤掉该行吗?