比较 python 中多维数组的行
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 和 return a-b 这样:
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()
谁能帮我解决这个问题???
一种方法是将 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]])
Broadcasting
基于矢量化方法 -
a[~((b[:,None,:] == a).all(2)).any(0)]
使用cdist
from scipy.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 数组
a= np.array([[2,2],[3,2],[4,2],[3,3],[5,3]])
b= np.array([[1,1],[1,3],[5,3]])
我想比较 a 与 b 和 return a-b 这样:
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()
谁能帮我解决这个问题???
一种方法是将 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]])
Broadcasting
基于矢量化方法 -
a[~((b[:,None,:] == a).all(2)).any(0)]
使用cdist
from scipy.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]])