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

Matlab equivalent in Python: logical XOR on arrays of different lengths?

我想将对两个向量进行异或运算的 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() 函数在不同长度的向量上工作正常,但 numpy 等价物需要相同长度的向量。

谁能建议我如何对两个不同长度的一维 numpy 数组执行异或运算?或者也许我误解了 Matlab 代码 and/or 中发生的事情,为此使用了错误的 Python 函数?

在此先感谢您的帮助。

MATLAB/Octave setxor

Return the elements exclusive to A or B, sorted in ascending order.

这是一个集合运算

octave:2> setxor([1,2,3,4],[5,3])
ans =
   1   2   4   5

np.logical_xor是逐元素比较,不是set操作。

我认为 numpy 中有一些 set 操作,但我会查找它们。我知道 Python

中有一个 set class
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 函数,它将由这些相同的部分构建。


宾果游戏,在 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]

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