Numpy——一些说明

关于效率

Numpy包含很多高效的函数,能够替换普通的循环,实现非常快

累加变成向量运算

对向量每个元素进行某个运算生成另一个向量

  • 普通用法

    1
    2
    3
    4
    5
    6
    import numpy as np
    a = np.zeros((n, 1))
    b = np.zeros((n, 1))

    for i in range(n):
    b[i] = math.exp(a[i])
  • 高效用法

    1
    2
    3
    import numpy as np
    a = np.zeros((n, 1))
    b = np.exp(a)
  • 相似的还有log,abs等函数

值得关注的广播机制(broadcasting)

  • 当两个向量(numpy的对象)的维度不同时,Python会将维度小的一个拓展(复制)成与维度大的相同,以便于计算
  • 举例
    1
    2
    a = np.zeros((n, 1))
    b = a + 10
广播规则
  • 形式1

    1
    2
    3
    (m,n) [+-*/] (m,1) 
    <===>
    (m,n) [+-*/] (m,n) # 按列复制第二个n次
  • 形式2

    1
    2
    3
    (m,n) [+-*/] (1,n) 
    <===>
    (m,n) [+-*/] (m,n) # 按行复制第二个m次
  • 形式3

    1
    2
    3
    (m,n) [+-*/] r # r为实数,维度为1
    <===>
    (m,n) [+-*/] (m,n) # 复制r m*n 次
  • 形式4

    1
    2
    3
    (m,1) [+-*/] (1,n) 
    <===>
    (m,n) [+-*/] (m,n) # 按行复制第二个m次,并按列复制第一个n次
需要注意
  • 广播机制使得书写更加美观,代码更加简洁
  • 但广播机制往往会出现用户意想不到的微妙bug, 需要开发者注意

关于矩阵运算的维度

  • axis=i表示第i维计算后将会消失(该维度的size变成1)

多使用reshape函数

  • reshape函数复杂度是常数的(O(1))
  • reshape函数可确保我们的程序正确,不用随意猜测矩阵的维度