Python NumPy 入门教程:从数组创建到广播运算,快速掌握高效数值计算

张开发
2026/4/27 10:03:34 15 分钟阅读

分享文章

Python NumPy 入门教程:从数组创建到广播运算,快速掌握高效数值计算
Python NumPy 入门教程从数组创建到广播运算快速掌握高效数值计算很多人在学完 Python 基础语法之后都会碰到一个非常现实的问题如果我要处理大量数字、矩阵、表格型数值数据只靠原生 list 会不会太慢、太笨重这时候NumPy往往就是第一个必须掌握的库。它是 Python 数值计算生态的基础组件。很多你后面会接触到的库比如Pandas、SciPy、scikit-learn、Matplotlib底层都离不开它。如果你是新手这篇文章的目标不是把NumPy讲得特别学术而是让你尽快搞明白NumPy到底是干什么的它和 Python 原生列表有什么区别最常用的数组操作怎么写新手最常用的广播、切片、聚合、条件筛选怎么理解怎样用一个完整示例快速上手学完之后你至少能独立写出常见的数组计算、基础矩阵处理和简单数据预处理代码。1. NumPy 是什么NumPy全名是Numerical Python是 Python 里最经典的数值计算库之一。它最核心的能力是提供一个高效的多维数组对象ndarray以及围绕数组进行批量计算的一整套函数。它特别适合这些场景批量数值计算向量和矩阵运算数据分析前的数据准备科学计算和算法实验机器学习里的特征处理简单说NumPy的优势不是“能不能算”而是让大量数值操作更快、更整洁、更适合批量处理。2. 为什么很多 Python 学习者都绕不开 NumPy如果你只处理几条数据Python 的list当然够用。但一旦进入下面这些场景NumPy的价值就会非常明显有一大批数字需要统一加减乘除需要按行按列做统计需要处理二维表格、矩阵或更高维数据需要做条件筛选、归一化、标准化后续还要接入Pandas或机器学习库比如你想把一组商品价格全部打九折原生列表通常要写循环用NumPy一行就能完成pricesnp.array([15,20,35,40])discountprices*0.9这类“整批运算”的能力就是NumPy最值得学的地方。3. 安装 NumPy直接安装pipinstallnumpy安装后可以简单检查版本python-cimport numpy as np; print(np.__version__)导入方式通常这样写importnumpyasnpnp是NumPy的常见别名几乎所有教程和项目都这么写。4. 先理解 NumPy 最核心的对象ndarrayNumPy里最重要的数据结构是ndarray也就是多维数组。可以先把它理解成“比 list 更适合数值运算的数组”。先看最简单的创建方式importnumpyasnp arrnp.array([10,20,30,40])print(arr)print(type(arr))输出类似[10 20 30 40] class numpy.ndarray二维数组也很常见matrixnp.array([[1,2,3],[4,5,6]])print(matrix)这时候你就可以把它看成一个2 行 3 列的数值矩阵。5. 常见的数组创建方式5.1 从列表创建arrnp.array([1,2,3,4,5])5.2 创建全 0 数组zerosnp.zeros((2,3))表示创建一个2 行 3 列的全零数组。5.3 创建全 1 数组onesnp.ones((3,2))5.4 创建连续数字arrnp.arange(1,10)这会得到[1 2 3 4 5 6 7 8 9]5.5 创建等间距数组arrnp.linspace(0,1,5)结果是从0到1均匀切成5个点。6. shape、dtype、ndim 这几个属性一定要熟NumPy数组最常用的基础信息包括shape形状dtype数据类型ndim维度数示例arrnp.array([[1,2,3],[4,5,6]])print(arr.shape)print(arr.dtype)print(arr.ndim)输出类似(2, 3) int64 2这里的意思是数组有2个维度形状是2 行 3 列元素类型是整数7. reshape改变数组形状reshape()是NumPy里非常高频的方法。arrnp.arange(1,13)matrixarr.reshape(3,4)print(arr)print(matrix)输出类似[ 1 2 3 4 5 6 7 8 9 10 11 12] [[ 1 2 3 4] [ 5 6 7 8] [ 9 10 11 12]]这类操作特别适合把一维数据整理成二维表格结构。8. 索引和切片如果你会 Python 列表切片NumPy会很快上手只是二维数组更常见。arrnp.arange(1,13).reshape(3,4)print(arr[1,2])print(arr[:,1])print(arr[0:2,1:3])含义分别是arr[1, 2]第 2 行第 3 列arr[:, 1]取第 2 列全部数据arr[0:2, 1:3]取前两行、第 2 到第 3 列新手一开始最重要的是先把“行列索引”的感觉建立起来。9. NumPy 为什么适合批量运算这是NumPy最核心的优势之一。arrnp.array([1,2,3,4])print(arr10)print(arr*2)print(arr/2)输出类似[11 12 13 14] [2 4 6 8] [0.5 1. 1.5 2. ]也就是说运算会直接作用到整个数组而不是要求你手写循环逐个处理。10. 广播机制新手一定要先理解个大概广播是NumPy非常经典的特性。你可以把它先简单理解成当不同形状的数据在某些规则下可以对齐时NumPy 会自动帮你把较小的数据“扩展”后再计算。最常见的例子pricesnp.array([15,20,35,40])discountprices*0.9print(discount)这里数组里的每个元素都会乘以0.9。再看一个二维例子scoresnp.array([[80,85,90],[75,88,92]])bonusnp.array([5,0,3])resultscoresbonusprint(result)这里bonus会按列广播到每一行。新手不需要一开始就背复杂规则但要先知道NumPy 很多“看起来没写循环”的批量计算本质上都和广播有关。11. 聚合统计sum、mean、max、min做数据处理时经常需要求和、均值、最大值、最小值。salesnp.array([[1200,1500,1800],[1000,1600,1700],[900,1400,2100]])print(sales.sum())print(sales.mean())print(sales.max())print(sales.min())如果想按行或按列统计就用axisprint(sales.sum(axis0))# 按列求和print(sales.mean(axis1))# 按行求均值可以先记住axis0沿着行方向压缩通常得到“每列结果”axis1沿着列方向压缩通常得到“每行结果”12. 条件筛选和布尔数组NumPy做筛选非常方便。scoresnp.array([88,92,79,95,90])high_scoresscores[scores90]print(high_scores)输出[92 95 90]你也可以得到一个布尔数组print(scores90)输出类似[False True False True True]这类写法在做数据清洗和过滤时非常常见。13. np.where条件替换如果你想根据条件生成新结果np.where()很常用。scoresnp.array([88,92,79,95,90])levelsnp.where(scores90,A,B)print(levels)输出[B A B A A]这个函数在做标签转换、分段判断时很好用。14. 随机数做模拟实验、机器学习、测试数据生成时随机数很常见。推荐新写法rngnp.random.default_rng(seed42)arrrng.integers(0,10,size(2,3))print(arr)这里的重点有两个seed42让结果可复现size(2, 3)表示生成一个2 行 3 列的数组15. 矩阵乘法NumPy当然也支持矩阵运算。anp.array([[1,2],[3,4]])bnp.array([[5,6],[7,8]])print(a b)输出[[19 22] [43 50]]这里的是矩阵乘法不是普通的逐元素乘法。如果写成print(a*b)那就是对应位置逐元素相乘。16. 一个适合新手直接运行的完整示例为了方便你本地练习我把常见操作整理成了一个独立脚本numpy_beginner_examples.py完整代码如下importnumpyasnpdefmain()-None:print(1. 创建数组)scoresnp.array([88,92,79,95,90])matrixnp.array([[1,2,3],[4,5,6]])print(scores ,scores)print(matrix \n,matrix)print(\n2. 查看形状和数据类型)print(scores.shape ,scores.shape)print(matrix.shape ,matrix.shape)print(scores.dtype ,scores.dtype)print(\n3. reshape 改变形状)numbersnp.arange(1,13)reshapednumbers.reshape(3,4)print(numbers ,numbers)print(reshaped \n,reshaped)print(\n4. 索引和切片)print(reshaped[1, 2] ,reshaped[1,2])print(reshaped[:, 1] ,reshaped[:,1])print(reshaped[0:2, 1:3] \n,reshaped[0:2,1:3])print(\n5. 广播机制)pricesnp.array([15,20,35,40],dtypefloat)discountprices*0.9print(prices ,prices)print(discount ,discount)print(\n6. 聚合统计)salesnp.array([[1200,1500,1800],[1000,1600,1700],[900,1400,2100],])print(sales \n,sales)print(总销售额 ,sales.sum())print(每个月总额 ,sales.sum(axis0))print(每个门店均值 ,sales.mean(axis1))print(\n7. 布尔筛选)high_scoresscores[scores90]print(scores 90 -,high_scores)print(\n8. 条件替换)levelsnp.where(scores90,A,B)print(levels ,levels)print(\n9. 随机数和可复现结果)rngnp.random.default_rng(seed42)random_matrixrng.integers(0,10,size(2,3))print(random_matrix \n,random_matrix)print(\n10. 矩阵乘法)anp.array([[1,2],[3,4]])bnp.array([[5,6],[7,8]])print(a b \n,a b)if__name____main__:main()17. 新手学 NumPy 最容易踩的坑把list和ndarray混着理解结果不知道为什么运算行为不同分不清逐元素乘法*和矩阵乘法reshape时元素个数对不上二维索引时把行列顺序写反不理解axis导致统计结果方向错了比较稳妥的学习顺序是先学数组创建、shape、dtype再学索引切片和 reshape再学批量运算、广播、聚合最后再学随机数、矩阵计算和和其他库配合18. 总结NumPy是 Python 数值计算最重要的基础库之一。对新手来说最关键的不是一下子学会所有函数而是先把下面几个能力练熟会创建数组会看 shape 和 dtype会切片和 reshape会做整批运算会做筛选和统计只要这几个基础打稳后面你去学Pandas、数据分析、机器学习都会轻松很多。如果你刚开始练习建议先把文中的示例脚本跑起来然后自己扩展这几个方向自己构造学生成绩表并做统计用随机数生成测试数据自己尝试二维数组按行按列计算把 NumPy 结果再交给 Pandas 做表格展示从“会看懂”到“会自己写”你就算真正入门NumPy了。

更多文章