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

时间:2015-10-10 15:55:23

标签: python matlab numpy xor

我想将在两个向量上执行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函数?

提前感谢您提供任何帮助。

1 个答案:

答案 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.uniquenp.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]

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