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.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
函数,它将由这些相同的部分构建。
宾果游戏,在 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]
所以它对数组进行排序连接,然后删除不唯一的元素。
我想将对两个向量进行异或运算的 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.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
函数,它将由这些相同的部分构建。
宾果游戏,在 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]
所以它对数组进行排序连接,然后删除不唯一的元素。