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