繁体   English   中英

比较python中的multidimesional数组的行

[英]Comparing rows of a multidimesional array in python

我有两个numpy数组

a= np.array([[2,2],[3,2],[4,2],[3,3],[5,3]])
b= np.array([[1,1],[1,3],[5,3]])

我想比较a和b并返回ab这样:

a-b = array([[2,2],
             [3,2],
             [4,2],
             [3,3]]) 

我试过做:

[x for x in a if x not in b] 

它导致了

[array([2, 2]), array([3, 2]), array([4, 2])] # where clearly [3,3] is missing

我甚至尝试比较循环中a和b的每一行,它给了我一个错误

The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

任何人都可以帮我解决这个问题???

基于Broadcasting的矢量化方法 -

a[~((b[:,None,:] == a).all(2)).any(0)]

使用cdistscipy.spatial.distance -

from scipy.spatial.distance import cdist

a[~(cdist(a,b)==0).any(1)]

样品运行 -

In [89]: a
Out[89]: 
array([[2, 2],
       [3, 2],
       [4, 2],
       [3, 3],
       [5, 3]])

In [90]: b
Out[90]: 
array([[1, 1],
       [1, 3],
       [5, 3]])

In [91]: a[~((b[:,None,:] == a).all(2)).any(0)]
Out[91]: 
array([[2, 2],
       [3, 2],
       [4, 2],
       [3, 3]])

In [92]: a[~(cdist(a,b)==0).any(1)]
Out[92]: 
array([[2, 2],
       [3, 2],
       [4, 2],
       [3, 3]])

一种方法是将numpy数组转换为元组列表,将b转换为元组集,然后执行与它们相同的列表理解。 示例 -

In [1]: import numpy as np

In [2]: a= np.array([[2,2],[3,2],[4,2],[3,3],[5,3]])

In [3]: b= np.array([[1,1],[1,3],[5,3]])

In [18]: alist = list(map(tuple, a))

In [19]: bset = set(map(tuple, b))

In [20]: np.array([x for x in alist if x not in bset])
Out[20]:
array([[2, 2],
       [3, 2],
       [4, 2],
       [3, 3]])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM