Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中比较多维数组的行_Python_Arrays_List_Numpy_Scipy - Fatal编程技术网

在python中比较多维数组的行

在python中比较多维数组的行,python,arrays,list,numpy,scipy,Python,Arrays,List,Numpy,Scipy,我有两个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进行比较并返回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])

我有两个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进行比较并返回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]])
基于小波变换的矢量化方法-

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

样本运行-

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]])

你的输出背后有什么逻辑吗?你到底想做什么样的比较?它不是减法,不是会员制,也不是索引。看起来您的输出只是
a
的前四个元素。我很难弄清楚它与
b
的关系。比较'a'和'b'的行。。返回与“b”行不匹配的“a”行
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]])