Python – NumPy基础使用教程

文章目录

  • 前言
  • 一、NumPy基础使用教程
  • 1. NumPy简介
  • 2. 安装NumPy
  • 3. NumPy数组基础
  • 3.1 创建数组
  • 3.2 数组的属性
  • 4. 数组的创建
  • 4.1 创建全零数组
  • 4.2 创建全一数组
  • 4.3 创建单位矩阵
  • 4.4 创建等差数列数组
  • 4.5 创建随机数组
  • 5. 数组的索引与切片
  • 5.1 一维数组的索引与切片
  • 5.2 二维数组的索引与切片
  • 6. 数组的操作
  • 6.1 改变数组形状
  • 6.2 拼接数组
  • 6.3 分割数组
  • 7. 数组的数学运算
  • 7.1 基本运算
  • 7.2 统计运算
  • 8. 广播机制
  • 9. 线性代数运算
  • 9.1 矩阵乘法
  • 9.2 求逆矩阵
  • 9.3 求特征值和特征向量
  • 10. 随机数生成
  • 10.1 生成均匀分布的随机数
  • 10.2 生成正态分布的随机数
  • 10.3 生成随机整数
  • 11. 文件操作
  • 11.1 保存数组到文件
  • 11.2 从文件加载数组
  • 11.3 保存和加载文本文件
  • 12. 性能优化
  • 12.1 避免使用循环
  • 12.2 使用`np.where()`进行条件操作
  • 12.3 使用`np.einsum()`进行高效的矩阵运算

  • 前言

    NumPy(Numerical Python)是Python中用于科学计算的核心库之一。它提供了高性能的多维数组对象和用于处理这些数组的工具。NumPy是许多其他科学计算库的基础,如Pandas、SciPy、Matplotlib等。本文从NumPy的基础知识开始,逐步深入,介绍了NumPy数组的创建、索引与切片、数学运算、广播机制、线性代数运算、随机数生成、文件操作以及性能优化等内容。希望通过本文的学习,你能够掌握NumPy的核心功能,并能够在实际项目中灵活运用。


    一、NumPy基础使用教程

    1. NumPy简介

    NumPy是一个开源的Python库,主要用于处理大型多维数组和矩阵。它提供了大量的数学函数来操作这些数组。NumPy的核心是ndarray对象,这是一个n维数组对象,具有快速的数值计算能力。

    2. 安装NumPy

    在使用NumPy之前,需要先安装它。通过以下命令使用pip安装NumPy:

    pip install numpy -i https://mirrors.aliyun.com/pypi/simple/
    

    安装完成后,通过以下代码验证是否安装成功:

    import numpy as np
    print(np.__version__)
    

    3. NumPy数组基础

    NumPy的核心是ndarray对象,它是一个多维数组对象。与Python的列表不同,NumPy数组中的元素必须是相同类型的,这使得NumPy数组在存储和操作上更加高效。

    3.1 创建数组

    可以通过多种方式创建NumPy数组,最简单的方式是使用np.array()函数:

    import numpy as np
    
    # 创建一维数组
    arr1 = np.array([1, 2, 3, 4, 5])
    print(arr1)
    
    # 创建二维数组
    arr2 = np.array([[1, 2, 3], [4, 5, 6]])
    print(arr2)
    

    打印结果如下所示:

    [1 2 3 4 5]
    [[1 2 3]
     [4 5 6]]
    

    3.2 数组的属性

    NumPy数组有许多有用的属性,如shapedtypesize等:

    import numpy as np
    
    # 创建二维数组
    arr2 = np.array([[1, 2, 3], [4, 5, 6]])
    
    print(arr2.shape)  # 输出数组的形状
    print(arr2.dtype)  # 输出数组的数据类型
    print(arr2.size)   # 输出数组的元素总数
    

    打印结果如下所示:

    (2, 3)
    int32
    6
    

    4. 数组的创建

    除了使用np.array()函数,NumPy还提供了许多其他创建数组的方法:

    4.1 创建全零数组

    import numpy as np
    
    zeros_arr = np.zeros((3, 4))  # 创建一个3行4列的全零数组
    print(zeros_arr)
    

    打印结果如下所示:

    [[0. 0. 0. 0.]
     [0. 0. 0. 0.]
     [0. 0. 0. 0.]]
    

    4.2 创建全一数组

    import numpy as np
    
    ones_arr = np.ones((2, 3))  # 创建一个2行3列的全一数组
    print(ones_arr)
    

    打印结果如下所示:

    [[1. 1. 1.]
     [1. 1. 1.]]
    

    4.3 创建单位矩阵

    import numpy as np
    
    eye_arr = np.eye(3)  # 创建一个3x3的单位矩阵
    print(eye_arr)
    

    打印结果如下所示:

    [[1. 0. 0.]
     [0. 1. 0.]
     [0. 0. 1.]]
    

    4.4 创建等差数列数组

    import numpy as np
    
    linspace_arr = np.linspace(0, 10, 5)  # 创建一个从0到10的等差数列,包含5个元素
    print(linspace_arr)
    

    打印结果如下所示:

    [ 0.   2.5  5.   7.5 10. ]
    

    4.5 创建随机数组

    import numpy as np
    
    random_arr = np.random.rand(2, 3)  # 创建一个2行3列的随机数组
    print(random_arr)
    

    打印结果如下所示:

    [[0.74149082 0.47613219 0.30698208]
     [0.37000744 0.98670655 0.40631318]]
    

    5. 数组的索引与切片

    NumPy数组的索引和切片操作与Python列表类似,但更加灵活。

    5.1 一维数组的索引与切片

    import numpy as np
    
    arr = np.array([1, 2, 3, 4, 5])
    print(arr[0])    # 输出第一个元素
    print(arr[1:4])  # 输出第2到第4个元素
    

    打印结果如下所示:

    1
    [2 3 4]
    

    5.2 二维数组的索引与切片

    import numpy as np
    
    arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
    print(arr[0, 1])      # 输出第1行第2列的元素
    print(arr[:, 1])      # 输出第2列的所有元素
    print(arr[1:3, 0:2])  # 输出第2到第3行,第1到第2列的子数组
    

    打印结果如下所示:

    2
    [2 5 8]
    [[4 5]
     [7 8]]
    

    6. 数组的操作

    NumPy提供了许多操作数组的函数,如改变数组形状、拼接数组、分割数组等。

    6.1 改变数组形状

    arr = np.array([[1, 2, 3], [4, 5, 6]])
    reshaped_arr = arr.reshape(3, 2)  # 将数组形状改为3行2列
    print(reshaped_arr)
    

    打印结果如下所示:

    [[1 2]
     [3 4]
     [5 6]]
    

    6.2 拼接数组

    import numpy as np
    
    arr1 = np.array([[1, 2], [3, 4]])
    arr2 = np.array([[5, 6], [7, 8]])
    concatenated_arr = np.concatenate((arr1, arr2), axis=0)  # 沿行方向拼接
    print(concatenated_arr)
    

    打印结果如下所示:

    [[1 2]
     [3 4]
     [5 6]
     [7 8]]
    

    6.3 分割数组

    import numpy as np
    
    arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
    split_arr = np.split(arr, 3, axis=0)  # 沿行方向分割为3个子数组
    print(split_arr)
    

    打印结果如下所示:

    [array([[1, 2, 3]]), array([[4, 5, 6]]), array([[7, 8, 9]])]
    

    7. 数组的数学运算

    NumPy提供了丰富的数学运算函数,可以对数组进行逐元素运算。

    7.1 基本运算

    import numpy as np
    
    arr1 = np.array([1, 2, 3])
    arr2 = np.array([4, 5, 6])
    
    print(arr1 + arr2)  # 逐元素相加
    print(arr1 * arr2)  # 逐元素相乘
    print(np.dot(arr1, arr2))  # 点积
    

    打印结果如下所示:

    [5 7 9]
    [ 4 10 18]
    32
    

    7.2 统计运算

    import numpy as np
    
    arr = np.array([[1, 2, 3], [4, 5, 6]])
    print(np.sum(arr))        # 计算所有元素的和
    print(np.mean(arr))       # 计算所有元素的平均值
    print(np.max(arr))        # 计算所有元素的最大值
    print(np.min(arr))        # 计算所有元素的最小值
    print(np.std(arr))        # 计算所有元素的标准差
    

    打印结果如下所示:

    21
    3.5
    6
    1
    1.707825127659933
    

    8. 广播机制

    广播是NumPy中用于在不同形状的数组之间进行算术运算的机制。广播机制允许NumPy在执行元素级操作时,自动扩展较小的数组以匹配较大数组的形状。

    import numpy as np
    
    arr1 = np.array([[1, 2, 3], [4, 5, 6]])
    arr2 = np.array([10, 20, 30])
    
    # arr2会被广播为与arr1相同的形状
    # arr2 = np.array([[10, 20, 30], [10, 20, 30]])
    result = arr1 + arr2
    print(result)
    

    打印结果如下所示:

    [[11 22 33]
     [14 25 36]]
    

    9. 线性代数运算

    NumPy提供了许多线性代数运算函数,如矩阵乘法、求逆、求特征值等。

    9.1 矩阵乘法

    import numpy as np
    
    arr1 = np.array([[1, 2], [3, 4]])
    arr2 = np.array([[5, 6], [7, 8]])
    result = np.dot(arr1, arr2)  # 矩阵乘法
    print(result)
    

    打印结果如下所示:

    [[19 22]
     [43 50]]
    

    9.2 求逆矩阵

    import numpy as np
    
    arr = np.array([[1, 2], [3, 4]])
    inv_arr = np.linalg.inv(arr)  # 求逆矩阵
    print(inv_arr)
    

    打印结果如下所示:

    [[-2.   1. ]
     [ 1.5 -0.5]]
    

    9.3 求特征值和特征向量

    import numpy as np
    
    arr = np.array([[1, 2], [2, 1]])
    eigenvalues, eigenvectors = np.linalg.eig(arr)  # 求特征值和特征向量
    print(eigenvalues)
    print(eigenvectors)
    

    打印结果如下所示:

    [ 3. -1.]
    [[ 0.70710678 -0.70710678]
     [ 0.70710678  0.70710678]]
    

    10. 随机数生成

    NumPy提供了丰富的随机数生成函数,可以生成各种分布的随机数。

    10.1 生成均匀分布的随机数

    import numpy as np
    
    random_arr = np.random.rand(2, 3)  # 生成2行3列的均匀分布随机数
    print(random_arr)
    

    打印结果如下所示:

    [[0.5009808  0.43969782 0.36369508]
     [0.39248427 0.41931195 0.5787968 ]]
    

    10.2 生成正态分布的随机数

    import numpy as np
    
    normal_arr = np.random.randn(2, 3)  # 生成2行3列的正态分布随机数
    print(normal_arr)
    

    打印结果如下所示:

    [[ 0.49734608 -0.16690934  0.44004618]
     [-1.50584439 -0.63712034  0.71691208]]
    

    10.3 生成随机整数

    import numpy as np
    
    int_arr = np.random.randint(0, 10, size=(2, 3))  # 生成2行3列的0到10之间的随机整数
    print(int_arr)
    

    打印结果如下所示:

    [[7 1 3]
     [1 4 8]]
    

    11. 文件操作

    NumPy提供了方便的文件操作函数,可以将数组保存到文件中,或从文件中加载数组。

    11.1 保存数组到文件

    import numpy as np
    
    arr = np.array([[1, 2, 3], [4, 5, 6]])
    np.save('array.npy', arr)  # 将数组保存到文件
    

    11.2 从文件加载数组

    import numpy as np
    
    loaded_arr = np.load('array.npy')  # 从文件加载数组
    print(loaded_arr)
    

    打印结果如下所示:

    [[1 2 3]
     [4 5 6]]
    

    11.3 保存和加载文本文件

    import numpy as np
    
    arr = np.array([[1, 2, 3], [4, 5, 6]])
    np.savetxt('array.txt', arr)  # 将数组保存为文本文件
    loaded_arr = np.loadtxt('array.txt')  # 从文本文件加载数组
    print(loaded_arr)
    

    打印结果如下所示:

    [[1. 2. 3.]
     [4. 5. 6.]]
    

    12. 性能优化

    NumPy的数组操作通常比Python的列表操作更快,但在处理大规模数据时,仍然需要注意性能优化。

    12.1 避免使用循环

    NumPy的数组操作是向量化的,尽量避免使用Python的循环操作数组。

    # 不推荐
    arr = np.array([1, 2, 3, 4, 5])
    result = np.zeros_like(arr)
    for i in range(len(arr)):
        result[i] = arr[i] * 2
    
    # 推荐
    result = arr * 2
    

    12.2 使用np.where()进行条件操作

    import numpy as np
    
    arr = np.array([1, 2, 3, 4, 5])
    result = np.where(arr > 3, arr, 0)  # 将大于3的元素保留,其余置为0
    print(result)
    

    打印结果如下所示:

    [0 0 0 4 5]
    

    12.3 使用np.einsum()进行高效的矩阵运算

    import numpy as np
    
    arr1 = np.array([[1, 2], [3, 4]])
    arr2 = np.array([[5, 6], [7, 8]])
    result = np.einsum('ij,jk->ik', arr1, arr2)  # 高效的矩阵乘法
    print(result)
    

    打印结果如下所示:

    [[19 22]
     [43 50]]
    

    作者:BigDataMagician

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python – NumPy基础使用教程

    发表回复