目前我正在使用numpy.logical_or和numpy.logical_来检查两个数组的元素是否具有相同的符号。想知道是否已经有一个ufunc或更有效的方法来实现这一目标。我目前的解决方案就在这里
a = np.array([1,-2,5,7,-11,9])
b = np.array([3,-8,4,81,5,16])
out = np.logical_or(
np.logical_and((a < 0),(b < 0)),
np.logical_and((a > 0),(b > 0))
)
编辑// 输出
out
Out[51]: array([ True, True, True, True, False, True], dtype=bool)
答案 0 :(得分:7)
使用元素产品的一种方法,然后检查>=0
,因为相同的符号(正面或均为负面)将产生正的产品值 -
((a== b) & (a==0)) | (a*b>0)
另一个带有明确签名的人 -
np.sign(a) == np.sign(b)
运行时测试 -
In [155]: a = np.random.randint(-10,10,(1000000))
In [156]: b = np.random.randint(-10,10,(1000000))
In [157]: np.allclose(np.sign(a) == np.sign(b), ((a== b) & (a==0)) | (a*b>0))
Out[157]: True
In [158]: %timeit np.sign(a) == np.sign(b)
100 loops, best of 3: 3.06 ms per loop
In [159]: %timeit ((a== b) & (a==0)) | (a*b>0)
100 loops, best of 3: 3.54 ms per loop
# @salehinejad's soln
In [160]: %timeit np.where((np.sign(a)+np.sign(b))==0)
100 loops, best of 3: 8.71 ms per loop
答案 1 :(得分:3)
在vanilla Python中,您可以执行以下操作:
abs(a + b) == abs(a) + abs(b)
如果符号相同,那将返回true。
答案 2 :(得分:1)
加法比乘法便宜。对于不等号:
np.where((np.sign(a)+np.sign(b))!=0)
对于等号:
np.where((np.sign(a)+np.sign(b))==0)
这种方法返回索引;不只是真/假等。
有问题的给定a和b的输出:
[0 1 2 3 5]
可以尝试使用np.sum()来获取两个以上的变量。
答案 3 :(得分:1)
import numpy as np
a = np.random.randn(5)
b = np.random.randn(5)
print a
print b
# Method 1
print np.logical_not(np.sign(a*b)-1)
# Method 2 ***probably best
print np.equal(np.sign(a), np.sign(b))
# Method 3
print np.where((a*b<0),np.zeros(5,dtype=bool),np.ones(5,dtype=bool))
# Method 4
print np.core.defchararray.startswith(np.array(-a*b).astype('str'),'-')
>>>
[-0.77184408 -0.55291345 -0.45774947 0.67080435 -0.286555 ]
[ 0.37220055 0.29489477 -1.05773195 1.03833121 1.01538001]
[False False True True False]
[False False True True False]
[False False True True False]
[False False True True False]
方法1
方法2
方法3
方法4
参考:
https://docs.scipy.org/doc/numpy/reference/generated/numpy.sign.html
https://docs.scipy.org/doc/numpy/reference/routines.logic.html
https://docs.scipy.org/doc/numpy/reference/generated/numpy.where.html
答案 4 :(得分:0)
您可以依赖按位运算符 XOR
x ^ y
异或运算也适用于符号,因此当它们相同时,结果大于 0,否则小于 0