AI_Python基础-9.NumPy

AI_Python基础-9.NumPy NumPy 数值计算基础标签 #Python #NumPy #数值计算 #ndarray #广播机制 #线性代数学习周期2 天 | 核心目标掌握 NumPy 多维数组的创建、索引、运算及广播机制为数据分析和机器学习打下基础4.1 NumPy数值计算NumPyNumerical Python是 Python 科学计算的核心库提供了高性能的多维数组对象ndarray和丰富的数组运算函数。几乎所有数据分析和机器学习库如 Pandas、Scikit-learn、TensorFlow都基于 NumPy。核心优势高速度底层 C 语言实现、高内存效率、丰富的数值运算功能。安装与导入pip install numpyimport numpy as np4.1.1ndarray多维数组的创建与属性shape, dtype1. 创建数组从列表/元组创建# 一维数组 arr1 np.array([1, 2, 3, 4, 5]) # 二维数组列表嵌套 arr2 np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) # 指定数据类型 arr_float np.array([1, 2, 3], dtypenp.float64) arr_int np.array([1, 2, 3], dtypenp.int32)内置创建函数常用函数说明示例np.zeros(shape)全0数组np.zeros((2,3))np.ones(shape)全1数组np.ones((3,2), dtypenp.int32)np.eye(N)单位矩阵N×Nnp.eye(3)np.full(shape, value)填充指定值np.full((2,3), 7)np.arange(start, stop, step)等差数列类似 rangenp.arange(0, 10, 2)→[0,2,4,6,8]np.linspace(start, stop, num)等间隔序列np.linspace(0, 1, 5)→[0.,0.25,0.5,0.75,1.]np.random.rand(d0,d1)[0,1) 均匀分布np.random.rand(2,3)np.random.randn(d0,d1)标准正态分布np.random.randn(2,3)np.random.randint(low, high, size)随机整数np.random.randint(0, 10, (2,3))2. 数组属性arr np.array([[1, 2, 3], [4, 5, 6]], dtypenp.float64) print(arr.shape) # (2, 3) → 2行3列 print(arr.ndim) # 2 → 维度数 print(arr.size) # 6 → 元素总数 print(arr.dtype) # float64 → 数据类型 print(arr.itemsize) # 8 → 每个元素字节数 # 改变形状不改变原数组返回新数组 arr_reshape arr.reshape((3, 2))易错点np.array()中的元素类型必须一致否则会自动向上转换如 int float → float。reshape()新形状的元素总数必须与原数组相同。一维数组的shape是(n,)注意末尾逗号。4.1.2 索引、切片、布尔索引、花式索引基础索引按位置arr1 np.arange(10) print(arr1[3]) # 3 print(arr1[-1]) # 9 arr2 np.array([[1,2,3],[4,5,6],[7,8,9]]) print(arr2[0,0]) # 1 print(arr2[1,2]) # 6 print(arr2[2]) # [7,8,9]整行切片范围取值# 一维切片 arr1 np.arange(10) print(arr1[2:5]) # [2,3,4] print(arr1[::2]) # [0,2,4,6,8] # 二维切片 arr2 np.array([[1,2,3],[4,5,6],[7,8,9]]) print(arr2[:2, :2]) # [[1,2],[4,5]] print(arr2[:, 1]) # [2,5,8]第2列 print(arr2[1, :]) # [4,5,6]第2行 # ⚠️ 切片返回视图修改会影响原数组 slice_view arr2[:2, :2] slice_view[0,0] 100 print(arr2[0,0]) # 变为100布尔索引条件筛选arr np.array([[1,2,3],[4,5,6],[7,8,9]]) mask arr 5 print(mask) # 布尔数组 print(arr[mask]) # [6,7,8,9] # 多条件 且| 或注意括号 print(arr[(arr 3) (arr 8)]) # [4,5,6,7] print(arr[(arr 2) | (arr 8)]) # [2,8]花式索引整数列表索引arr1 np.arange(10) indices [1,3,5,7] print(arr1[indices]) # [1,3,5,7] arr2 np.array([[1,2,3],[4,5,6],[7,8,9]]) row [0,2]; col [1,2] print(arr2[row, col]) # [2,9]取(0,1)和(2,2) print(arr2[[0,2], :]) # 取第1行和第3行的所有列索引方式对比方式返回类型是否影响原数组基础索引标量或子数组修改影响原数组切片视图view修改影响原数组布尔索引副本copy修改不影响原数组花式索引副本copy修改不影响原数组4.1.3 广播机制Broadcasting广播允许不同形状的数组进行算术运算无需手动调整形状。核心规则从尾部维度对齐维度较少的数组在前面补1。每个维度上两个数组的形状要么相等要么其中一个为1要么缺失。满足条件则可广播否则报错ValueError。# 标量与数组 arr np.array([1,2,3]) print(arr 10) # [11,12,13] # 一维 二维 a np.array([[1,2,3],[4,5,6]]) # (2,3) b np.array([10,20,30]) # (3,) → 广播为 (1,3) → (2,3) print(a b) # 每行加 b # 列向量广播 col np.array([[1],[2],[3]]) # (3,1) row np.array([10,20,30]) # (3,) → (1,3) print(col row) # (3,3) # 不兼容示例 # a np.ones((3,2)); b np.ones((4,)) → ValueError4.1.4 通用函数ufunc通用函数对数组逐元素高效运算底层 C 实现速度极快。数学函数arr np.array([1,4,9,16]) print(np.sqrt(arr)) # [1.,2.,3.,4.] print(np.exp(arr)) # e^x print(np.log(arr)) # 自然对数 print(np.log10(arr)) # 以10为底 print(np.sin(arr)) # 正弦弧度 print(np.cos(arr)) print(np.abs([-1,-2])) # [1,2] print(np.ceil(3.2)) # 4.0 print(np.floor(3.9)) # 3.0二元通用函数a np.array([1,2,3]) b np.array([4,5,6]) print(np.add(a,b)) # [5,7,9] print(np.maximum(a,b)) # [4,5,6] print(np.minimum(a,b)) # [1,2,3] print(np.power(a,2)) # [1,4,9]比较函数print(np.greater(a,b)) # [False,False,False] print(np.equal(a,b)) # [False,False,False]4.1.5 数组运算元素级算术运算a np.array([[1,2],[3,4]]) b np.array([[5,6],[7,8]]) print(a b) # 加法 print(a - b) # 减法 print(a * b) # 逐元素乘法不是矩阵乘法 print(a / b) # 除法 print(a ** 2) # 逐元素平方矩阵乘法# 方式1 运算符推荐 print(a b) # 方式2np.dot() print(np.dot(a, b)) # 方式3np.matmul() print(np.matmul(a, b)) # 一维数组点积 x np.array([1,2,3]) y np.array([4,5,6]) print(np.dot(x, y)) # 1*42*53*632统计方法arr np.array([[1,2,3],[4,5,6],[7,8,9]]) print(arr.sum()) # 45总和 print(arr.sum(axis0)) # [12,15,18]按列求和 print(arr.sum(axis1)) # [6,15,24]按行求和 print(arr.mean()) # 5.0 print(arr.mean(axis0)) # [4.,5.,6.] print(arr.std()) # 标准差 print(arr.var()) # 方差 print(arr.max()) # 9 print(arr.min()) # 1 print(arr.argmax(axis0)) # 每列最大值的行索引 [2,2,2] print(np.median(arr)) # 5.0中位数 print(arr.cumsum()) # 累积和 [1,3,6,10,15,21,28,36,45]axis参数理解axis0沿着行方向垂直对每一列操作axis1沿着列方向水平对每一行操作4.1.6 线性代数基础np.linalgimport numpy as np from numpy import linalg as LA A np.array([[1, 2], [3, 4]]) B np.array([[5, 6], [7, 8]]) # 矩阵乘法 C A B # 转置 print(A.T) # [[1,3],[2,4]] # 逆矩阵仅方阵 A_inv LA.inv(A) print(A A_inv) # 近似单位矩阵 # 行列式 det LA.det(A) # -2.0 # 迹对角线之和 trace np.trace(A) # 5 # 特征值和特征向量 eigenvalues, eigenvectors LA.eig(A) # 解线性方程组 Ax b A_eq np.array([[3,1],[1,2]]) b_eq np.array([9,8]) x LA.solve(A_eq, b_eq) # [2.,3.] # 矩阵的秩 rank LA.matrix_rank(A) # 2 # 最小二乘法拟合 # x_lsq, residuals, rank, s LA.lstsq(A, b, rcondNone)注意事项求逆和行列式仅适用于方阵非方阵会报错。若矩阵奇异行列式为0inv()会抛出LinAlgError。solve()要求系数矩阵满秩否则用lstsq()。 学习资料Obsidian 可直接收藏官方文档NumPy 官方快速入门NumPy 中文文档广播机制详解线性代数指南中文教程菜鸟教程 - NumPy廖雪峰 - NumPy 基础视频推荐莫烦 Python - NumPy 教程B站 学习建议2 天计划第 1 天掌握ndarray创建、属性、基本索引和切片重点练习布尔索引和花式索引理解广播机制。第 2 天学习通用函数、数组运算矩阵乘法、统计方法了解np.linalg常用线性代数函数。✅ 核心要点总结ndarray同质多维数组核心属性shape、dtype、ndim、size。创建方式np.array()、np.zeros()、np.ones()、np.arange()、np.linspace()、np.random.rand()等。索引与切片基本索引、切片返回视图、布尔索引返回副本、花式索引返回副本。广播机制形状兼容的数组可直接运算自动扩展维度规则清晰。通用函数ufuncnp.sqrt()、np.exp()、np.sin()等逐元素高效计算。数组运算元素级算术运算矩阵乘法用或np.dot()统计方法可指定axis。线性代数np.linalg提供逆、行列式、特征值、解方程组等。练习题自测创建一个 5×5 的随机整数矩阵范围 0-100计算其均值、标准差、最大值和最小值。创建两个 3×3 矩阵A和B计算A B、A - B、A B以及A的转置。使用布尔索引将数组中所有大于 5 的元素替换为 0。创建一个形状为 (4, 3) 的数组通过广播将每一行都减去该行的平均值实现行中心化。解线性方程组2x y 5 x - 3y -1生成 1000 个服从正态分布的随机数计算其均值和标准差并绘制直方图可使用 Matplotlib选做。建议在 Jupyter Notebook 中逐步练习观察数组形状和广播行为。