Python中的Matlab等价物:不同长度数组上的逻辑异或?
我想把对两个向量进行异或运算的Matlab代码转换成Python。我曾尝试使用numpy.logical_xor()函数来实现这一点,但失败了,因为正在比较的两个数组的形状不相同,从而阻止了广播工作 我试图模拟的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
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]