详解 NumPy:关键知识点梳理与实践应用指引
一、NumPy简介
NumPy(Numerical Python)是一个功能强大的Python库,主要用于对多维数组(ndarray)进行高效的操作。它是许多其他数据科学和机器学习库(如Scikit - learn、Pandas等)的基础。
- 安装
- 可以使用
pip install numpy命令在命令行中安装NumPy。如果使用Anaconda环境,NumPy通常已经预先安装。
- 可以使用
- 导入
- 一般在Python脚本或交互式环境中,使用
import numpy as np来导入NumPy库。这样在后续代码中可以使用np作为NumPy的别名来调用其函数和对象。
- 一般在Python脚本或交互式环境中,使用
二、NumPy数组(ndarray)基础
- 创建数组
- 从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.]。
- 从Python列表创建
- 数组的属性
- 形状(shape)
- 可以通过
ndarray.shape属性获取数组的形状。对于一维数组,它返回一个整数,表示数组元素的个数;对于二维数组,它返回一个元组,如(m, n),其中m是行数,n是列数。例如,对于数组a = np.array([[1, 2], [3, 4]]),a.shape的值为(2, 2)。
- 可以通过
- 数据类型(dtype)
ndarray.dtype属性返回数组元素的数据类型。NumPy支持多种数据类型,如int32、float64、complex128等。例如,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。
- 形状(shape)
- 数组的索引和切片
- 一维数组
- 索引:和Python列表类似,使用方括号和索引值来访问数组元素。例如,对于数组
a = np.array([1, 2, 3]),a[0]访问第一个元素,即1。 - 切片:使用
start:stop:step的形式。例如,a[0:2]返回[1, 2],a[::2]返回[1, 3]。
- 索引:和Python列表类似,使用方括号和索引值来访问数组元素。例如,对于数组
- 二维数组
- 索引:可以使用
a[row_index, col_index]的形式。例如,对于数组b = np.array([[1, 2], [3, 4]]),b[0, 0]访问第一行第一列的元素,即1。 - 切片:对于行和列可以分别进行切片。例如,
b[0:1, 0:2]返回一个包含第一行所有元素的二维数组,即[[1, 2]]。
- 索引:可以使用
- 一维数组
三、NumPy数组的运算
- 算术运算
- 元素级运算
- 对于形状相同的数组,可以进行元素级的加、减、乘、除等运算。例如,对于数组
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)的数组在列方向上进行广播,使其形状与另一个数组匹配,然后进行元素级加法。
- 当两个数组形状不同但满足一定规则时,NumPy会自动进行广播运算。例如,一个形状为
- 元素级运算
- 数学函数
- NumPy提供了大量的数学函数,如
np.sin()、np.cos()、np.exp()、np.log()等。这些函数可以对数组中的每个元素进行操作。例如,对于数组a = np.array([0, np.pi/2, np.pi]),np.sin(a)得到[0., 1., 0.]。
- NumPy提供了大量的数学函数,如
- 统计函数
- 求和(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()分别用于计算数组元素的标准差和方差。它们也可以指定轴参数来计算二维数组按行或列的标准差和方差。
- 求和(sum)
四、线性代数运算
- 矩阵乘法
- 可以使用
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]]。
- 可以使用
- 求逆矩阵
- 对于方阵,可以使用
np.linalg.inv()函数求其逆矩阵。例如,对于矩阵A = np.array([[1, 2], [3, 4]]),np.linalg.inv(A)得到逆矩阵[[-2., 1. ], [1.5, -0.5]]。
- 对于方阵,可以使用
- 特征值和特征向量
- 使用
np.linalg.eig()函数可以同时求出矩阵的特征值和特征向量。例如,对于矩阵A,np.linalg.eig(A)返回两个值,第一个是特征值数组,第二个是对应的特征向量数组(以列向量形式存储)。
- 使用
五、数组操作和变换
- 形状变换
- 重塑(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()返回的数组进行修改可能会影响原数组。
- 重塑(reshape)
- 数组拼接和分割
- 拼接(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]。也可以指定分割点的位置来进行非等分割。
- 拼接(concatenate、hstack、vstack)
六、高级索引和布尔索引
- 高级索引
- 整数数组索引
- 可以使用整数数组来索引数组。例如,对于数组
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]]。
- 花式索引是一种更灵活的整数数组索引方式。例如,对于二维数组
- 整数数组索引
- 布尔索引
- 可以根据布尔数组来选择数组中的元素。例如,对于数组
a = np.array([1, 2, 3, 4, 5]),创建布尔数组b = a > 3(得到[False, False, False, True, True]),然后a[b]得到[4, 5]。对于二维数组,可以使用布尔数组来选择满足条件的行或列。
- 可以根据布尔数组来选择数组中的元素。例如,对于数组
浙公网安备 33010602011771号