Python中的Matlab等价物:不同长度数组上的逻辑异或?

Python中的Matlab等价物:不同长度数组上的逻辑异或?,python,matlab,numpy,xor,Python,Matlab,Numpy,Xor,我想把对两个向量进行异或运算的Matlab代码转换成Python。我曾尝试使用numpy.logical_xor()函数来实现这一点,但失败了,因为正在比较的两个数组的形状不相同,从而阻止了广播工作 我试图模拟的Matlab代码: test5=setxor(1:length(test2(test3)),test4); 当前(非工作)尝试在Python中执行上述操作: test5 = np.logical_xor(np.array(range(len(test2[test3]))), test4

我想把对两个向量进行异或运算的Matlab代码转换成Python。我曾尝试使用numpy.logical_xor()函数来实现这一点,但失败了,因为正在比较的两个数组的形状不相同,从而阻止了广播工作

我试图模拟的Matlab代码:

test5=setxor(1:length(test2(test3)),test4);
当前(非工作)尝试在Python中执行上述操作:

test5 = np.logical_xor(np.array(range(len(test2[test3]))), test4)
当执行此行时,我得到以下错误:

ValueError: operands could not be broadcast together with shapes (366217,) (120655,)
当我使用numpy.expand_dims()向每个数组添加一个轴时,我也会得到相同的结果,我会得到如下消息

ValueError: operands could not be broadcast together with shapes (1, 366217) (1, 120655)
ValueError: operands could not be broadcast together with shapes (366217,1) (120655,1)
问题在于test2[test3]和test4的长度不同,Matlab setxor()functino似乎可以很好地处理不同长度的向量,但numpy等效项需要长度相等的向量

有人能建议我如何在两个不同长度的1-D numpy数组上执行异或吗?或者我可能误解了Matlab代码中发生的事情和/或为此使用了错误的Python函数


在此提前感谢您的帮助。

MATLAB/Octave
setxor

返回A或B专有的元素,按升序排序

这是一个固定的操作

octave:2> setxor([1,2,3,4],[5,3])
ans =
   1   2   4   5
np.逻辑异或是一个元素对一个元素的比较,而不是一个
set
操作

我想在
numpy
中有一些
set
操作,但我必须查找它们。我知道Python中有一个
set

In [176]: x=set([1,2,3,4])    
In [177]: x.symmetric_difference([5,3])
Out[177]: set([1, 2, 4, 5])
setdiff1d
是一个
set difference
函数,可以用作

In [188]: xa=np.array([1,2,3,4])
In [189]: ya=np.array([5,3])
In [190]: np.concatenate([np.setdiff1d(xa,ya),np.setdiff1d(ya,xa)])
Out[190]: array([1, 2, 4, 5])
它使用
np.unique
np.inad
;可以使用这些函数重写setxor

In [199]: np.concatenate([xa[np.in1d(xa,ya,invert=True)],
      ya[np.in1d(ya,xa,invert=True)]])
Out[199]: array([1, 2, 4, 5])
(可能需要先使用
xa=np.unique(xa)
etc)

我的猜测是,如果有一个已定义的
setxor
函数,它将由这些相同的片段构建


宾果,谷歌搜索
numpy集操作产生:

它有:(对于2个唯一的数组)


因此,它对数组进行排序串联,然后删除不唯一的元素。

如果您提供一个简单的所需输入和输出示例(使用更小的test2、test3和test4),并用文字说明Matlab代码的用途,可能会更容易提供帮助。回答很好,这正是解决方案,它现在适合我了。谢谢
In [201]: np.setxor1d(xa,ya)
Out[201]: array([1, 2, 4, 5])
    aux = np.concatenate( (ar1, ar2) )
    aux.sort()
    flag = np.concatenate( ([True], aux[1:] != aux[:-1], [True] ) )
    flag2 = flag[1:] == flag[:-1]
    return aux[flag2]