检查两个数值是否在numpy(+/-)中具有相同的符号

时间:2017-04-12 22:47:56

标签: python numpy

目前我正在使用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)

5 个答案:

答案 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

  • a * b产生值数组,当符号不同时为负数
  • np.sign()将数组转换为-1和1
  • 减1将数组转换为-2和0
  • np.logical_not()将-2转换为False;和0到True

方法2

  • np.sign()转换为-1,1
  • np.equal()比较两个数组,如果元素相同,则给出真值

方法3

  • np.where(condition [,x,y])根据条件从x或y返回元素。
  • np.zeros(5,dtype = bool),np.ones(5,dtype = bool)分别为False和True数组

方法4

  • 乘以-a * b
  • 将结果数组转换为dtype string
  • 检查哪些元素以 -
  • 开头

参考:

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

https://docs.scipy.org/doc/numpy/reference/generated/numpy.core.defchararray.startswith.html#numpy.core.defchararray.startswith

答案 4 :(得分:0)

您可以依赖按位运算符 XOR

x ^ y

异或运算也适用于符号,因此当它们相同时,结果大于 0,否则小于 0