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 函数可确保我们的程序正确,不用随意猜测矩阵的维度

附录:使用 numpy 包为 Python 内置对象提效

  • numpy 包可以直接操作 list 等对象

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    # # 一维数组
    import numpy as np

    arr = np.array([1, 2, 3, 4, 5])
    mean = np.mean(arr)
    print(mean) # 输出:3.0,整数数组计算均值默认返回浮点数(如 int32 数组返回 float64);若指定 dtype=np.int32,结果会向下取整

    # # 二维数组
    arr = np.array([[1, 2, 3],
    [4, 5, 6]])

    # 沿轴0(列方向)计算均值:每列的均值
    mean_axis0 = np.mean(arr, axis=0)
    print(mean_axis0) # 输出:[2.5 3.5 4.5]

    # 沿轴1(行方向)计算均值:每行的均值
    mean_axis1 = np.mean(arr, axis=1)
    print(mean_axis1) # 输出:[2. 5.]

    # 全局均值(展平后)
    mean_all = np.mean(arr)
    print(mean_all) # 输出:3.5
  • 注意事项:

    • 若数组包含 np.nannp.mean 会返回 nan,需用 np.nanmean 忽略缺失值
    • 对空数组调用 np.mean 会抛出 RuntimeWarning,并返回 nan
  • np.mean 支持多维数组、指定轴计算,且效率远高于 Python 内置的 statistics.meanstatistics 是 Python 内置库)