一、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]
。对于二维数组,可以使用布尔数组来选择满足条件的行或列。
- 可以根据布尔数组来选择数组中的元素。例如,对于数组