二元运算

In [1]:

  1. import numpy as np

四则运算

运算 函数
a + b add(a,b)
a - b subtract(a,b)
a * b multiply(a,b)
a / b divide(a,b)
a ** b power(a,b)
a % b remainder(a,b)

以乘法为例,数组与标量相乘,相当于数组的每个元素乘以这个标量:

In [2]:

  1. a = np.array([1,2])
  2. a * 3

Out[2]:

  1. array([3, 6])

数组逐元素相乘:

In [3]:

  1. a = np.array([1,2])
  2. b = np.array([3,4])
  3. a * b

Out[3]:

  1. array([3, 8])

使用函数:

In [4]:

  1. np.multiply(a, b)

Out[4]:

  1. array([3, 8])

事实上,函数还可以接受第三个参数,表示将结果存入第三个参数中:

In [5]:

  1. np.multiply(a, b, a)

Out[5]:

  1. array([3, 8])

In [6]:

  1. a

Out[6]:

  1. array([3, 8])

比较和逻辑运算

运算 函数<
== equal
!= not_equal
> greater
>= greater_equal
< less
<= less_equal
logical_and
logical_or
logical_xor
logical_not
& bitwise_and
bitwise_or
^ bitwise_xor
~ invert
>> right_shift
<< left_shift

等于操作也是逐元素比较的:

In [7]:

  1. a = np.array([[1,2,3,4],
  2. [2,3,4,5]])
  3. b = np.array([[1,2,5,4],
  4. [1,3,4,5]])
  5. a == b

Out[7]:

  1. array([[ True, True, False, True],
  2. [False, True, True, True]], dtype=bool)

这意味着,如果我们在条件中要判断两个数组是否一样时,不能直接使用

  1. if a == b:

而要使用:

  1. if all(a==b):

对于浮点数,由于存在精度问题,使用函数 allclose 会更好:

  1. if allclose(a,b):

logical_and 也是逐元素的 and 操作:

In [8]:

  1. a = np.array([0,1,2])
  2. b = np.array([0,10,0])
  3.  
  4. np.logical_and(a, b)

Out[8]:

  1. array([False, True, False], dtype=bool)

0 被认为是 False,非零则是 True

比特操作:

In [9]:

  1. a = np.array([1,2,4,8])
  2. b = np.array([16,32,64,128])
  3.  
  4. a | b

Out[9]:

  1. array([ 17, 34, 68, 136])

取反:

In [10]:

  1. a = np.array([1,2,3,4], np.uint8)
  2. ~a

Out[10]:

  1. array([254, 253, 252, 251], dtype=uint8)

左移:

In [11]:

  1. a << 3

Out[11]:

  1. array([ 8, 16, 24, 32], dtype=uint8)

要注意的是 & 的运算优先于比较运算如 > 等,所以必要时候需要加上括号:

In [12]:

  1. a = np.array([1,2,4,8])
  2. b = np.array([16,32,64,128])
  3.  
  4. (a > 3) & (b < 100)

Out[12]:

  1. array([False, False, True, False], dtype=bool)

原文: https://nbviewer.jupyter.org/github/lijin-THU/notes-python/blob/master/03-numpy/03.15-binary-operators.ipynb