详解 NumPy:关键知识点梳理与实践应用指引

一、NumPy简介

NumPy(Numerical Python)是一个功能强大的Python库,主要用于对多维数组(ndarray)进行高效的操作。它是许多其他数据科学和机器学习库(如Scikit - learn、Pandas等)的基础。

  1. 安装
    • 可以使用pip install numpy命令在命令行中安装NumPy。如果使用Anaconda环境,NumPy通常已经预先安装。
  2. 导入
    • 一般在Python脚本或交互式环境中,使用import numpy as np来导入NumPy库。这样在后续代码中可以使用np作为NumPy的别名来调用其函数和对象。

二、NumPy数组(ndarray)基础

  1. 创建数组
    • 从Python列表创建
      • 可以使用np.array()函数从Python列表创建NumPy数组。例如,a = np.array([1, 2, 3])创建了一个一维数组。如果是二维数组,可以使用b = np.array([[1, 2], [3, 4]])
    • 使用特定函数创建
      • np.zeros():创建全零数组。例如,np.zeros((3, 4))创建一个形状为(3,4)的二维全零数组,其中第一个参数是数组的形状(可以是元组形式)。
      • np.ones():创建全一数组。如np.ones(5)创建一个包含5个元素的一维全一数组。
      • np.arange():类似于Python的range()函数,用于创建等差数组。例如,np.arange(0, 10, 2)创建一个从0开始,以2为步长,小于10的数组,即[0, 2, 4, 6, 8]
      • np.linspace():用于创建指定数量的等间隔数组。例如,np.linspace(0, 1, 5)创建一个在0到1之间包含5个元素的等间隔数组,即[0., 0.25, 0.5, 0.75, 1.]
  2. 数组的属性
    • 形状(shape)
      • 可以通过ndarray.shape属性获取数组的形状。对于一维数组,它返回一个整数,表示数组元素的个数;对于二维数组,它返回一个元组,如(m, n),其中m是行数,n是列数。例如,对于数组a = np.array([[1, 2], [3, 4]])a.shape的值为(2, 2)
    • 数据类型(dtype)
      • ndarray.dtype属性返回数组元素的数据类型。NumPy支持多种数据类型,如int32float64complex128等。例如,a = np.array([1, 2, 3], dtype = np.float32)a.dtype的值为np.float32
    • 维度(ndim)
      • ndarray.ndim属性返回数组的维度。例如,一维数组的维度为1,二维数组的维度为2。如a = np.array([1, 2, 3])a.ndim的值为1;b = np.array([[1, 2], [3, 4]])b.ndim的值为2。
  3. 数组的索引和切片
    • 一维数组
      • 索引:和Python列表类似,使用方括号和索引值来访问数组元素。例如,对于数组a = np.array([1, 2, 3])a[0]访问第一个元素,即1。
      • 切片:使用start:stop:step的形式。例如,a[0:2]返回[1, 2]a[::2]返回[1, 3]
    • 二维数组
      • 索引:可以使用a[row_index, col_index]的形式。例如,对于数组b = np.array([[1, 2], [3, 4]])b[0, 0]访问第一行第一列的元素,即1。
      • 切片:对于行和列可以分别进行切片。例如,b[0:1, 0:2]返回一个包含第一行所有元素的二维数组,即[[1, 2]]

三、NumPy数组的运算

  1. 算术运算
    • 元素级运算
      • 对于形状相同的数组,可以进行元素级的加、减、乘、除等运算。例如,对于数组a = np.array([1, 2, 3])b = np.array([4, 5, 6])a + b得到[5, 7, 9]a * b得到[4, 10, 18]
    • 广播机制
      • 当两个数组形状不同但满足一定规则时,NumPy会自动进行广播运算。例如,一个形状为(3, 1)的数组和一个形状为(3,)的数组相加,NumPy会将形状为(3, 1)的数组在列方向上进行广播,使其形状与另一个数组匹配,然后进行元素级加法。
  2. 数学函数
    • NumPy提供了大量的数学函数,如np.sin()np.cos()np.exp()np.log()等。这些函数可以对数组中的每个元素进行操作。例如,对于数组a = np.array([0, np.pi/2, np.pi])np.sin(a)得到[0., 1., 0.]
  3. 统计函数
    • 求和(sum)
      • 可以使用ndarray.sum()方法对数组中的元素求和。对于二维数组,可以指定轴参数来按行或列求和。例如,对于数组b = np.array([[1, 2], [3, 4]])b.sum()得到所有元素的和10,b.sum(axis = 0)按列求和得到[4, 6]b.sum(axis = 1)按行求和得到[3, 7]
    • 平均值(mean)
      • ndarray.mean()方法用于计算数组元素的平均值。同样,对于二维数组可以指定轴参数。例如,b.mean()得到平均值2.5,b.mean(axis = 0)得到列平均值[2., 3.]b.mean(axis = 1)得到行平均值[1.5, 3.5]
    • 标准差(std)和方差(var)
      • ndarray.std()ndarray.var()分别用于计算数组元素的标准差和方差。它们也可以指定轴参数来计算二维数组按行或列的标准差和方差。

四、线性代数运算

  1. 矩阵乘法
    • 可以使用np.dot()函数或者@运算符(在Python 3.5及以上版本支持)来进行矩阵乘法。例如,对于矩阵A = np.array([[1, 2], [3, 4]])B = np.array([[5, 6], [7, 8]])np.dot(A, B)或者A @ B得到[[19, 22], [43, 50]]
  2. 求逆矩阵
    • 对于方阵,可以使用np.linalg.inv()函数求其逆矩阵。例如,对于矩阵A = np.array([[1, 2], [3, 4]])np.linalg.inv(A)得到逆矩阵[[-2., 1. ], [1.5, -0.5]]
  3. 特征值和特征向量
    • 使用np.linalg.eig()函数可以同时求出矩阵的特征值和特征向量。例如,对于矩阵Anp.linalg.eig(A)返回两个值,第一个是特征值数组,第二个是对应的特征向量数组(以列向量形式存储)。

五、数组操作和变换

  1. 形状变换
    • 重塑(reshape)
      • ndarray.reshape()方法可以改变数组的形状。例如,对于一维数组a = np.array([1, 2, 3, 4])a.reshape((2, 2))将其重塑为一个形状为(2, 2)的二维数组[[1, 2], [3, 4]]。需要注意的是,重塑后的数组元素个数必须与原数组相同。
    • 展平(flatten)和ravel
      • ndarray.flatten()ndarray.ravel()都可以将多维数组展平为一维数组。它们的区别在于flatten()返回一个副本,而ravel()返回一个视图(如果可能的话)。例如,对于二维数组b = np.array([[1, 2], [3, 4]])b.flatten()b.ravel()都返回[1, 2, 3, 4],但对b.ravel()返回的数组进行修改可能会影响原数组。
  2. 数组拼接和分割
    • 拼接(concatenate、hstack、vstack)
      • np.concatenate()函数可以沿着指定的轴拼接多个数组。例如,对于数组a = np.array([1, 2])b = np.array([3, 4])np.concatenate((a, b))得到[1, 2, 3, 4]np.hstack()用于水平拼接(按列拼接),np.vstack()用于垂直拼接(按行拼接)。
    • 分割(split)
      • np.split()函数可以将一个数组分割成多个子数组。例如,对于数组c = np.array([1, 2, 3, 4])np.split(c, 2)将其分割成两个长度相等的子数组[1, 2][3, 4]。也可以指定分割点的位置来进行非等分割。

六、高级索引和布尔索引

  1. 高级索引
    • 整数数组索引
      • 可以使用整数数组来索引数组。例如,对于数组a = np.array([1, 2, 3, 4, 5]),使用b = np.array([0, 2, 4])作为索引,a[b]得到[1, 3, 5]。对于二维数组,可以使用两个整数数组来分别指定行和列的索引。
    • 花式索引
      • 花式索引是一种更灵活的整数数组索引方式。例如,对于二维数组A = np.array([[1, 2], [3, 4], [5, 6]]),使用b = np.array([0, 2])作为行索引,A[b]得到[[1, 2], [5, 6]]
  2. 布尔索引
    • 可以根据布尔数组来选择数组中的元素。例如,对于数组a = np.array([1, 2, 3, 4, 5]),创建布尔数组b = a > 3(得到[False, False, False, True, True]),然后a[b]得到[4, 5]。对于二维数组,可以使用布尔数组来选择满足条件的行或列。
posted @ 2024-12-25 15:06  软件职业规划  阅读(17)  评论(0编辑  收藏  举报