我想将在两个向量上执行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)
当此行执行时,我收到以下错误:
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阵列上执行XOR?或者我可能误解了Matlab代码中发生的事情和/或使用了错误的Python函数?
提前感谢您提供任何帮助。
答案 0 :(得分:3)
MATLAB / Octave setxor
返回A或B独有的元素,按升序排序。
这是一套设定的操作
octave:2> setxor([1,2,3,4],[5,3])
ans =
1 2 4 5
np.logical_xor
是按元素比较的元素,而不是set
操作。
我认为set
中有一些numpy
次操作,但我已查看过它们了。我知道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.in1d
;可以使用这些函数重写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)
等。)
我的猜测是,如果有一个定义的setxor
函数,它将从这些相同的部分构建。
Bingo,numpy set operations
上的Google搜索产生了:
http://docs.scipy.org/doc/numpy/reference/routines.set.html
In [201]: np.setxor1d(xa,ya)
Out[201]: array([1, 2, 4, 5])
确实:(对于2个独特的数组)
aux = np.concatenate( (ar1, ar2) )
aux.sort()
flag = np.concatenate( ([True], aux[1:] != aux[:-1], [True] ) )
flag2 = flag[1:] == flag[:-1]
return aux[flag2]
因此它对数组进行了排序连接,然后删除了不唯一的元素。