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,一行就能完成:
prices=np.array([15,20,35,40])discount=prices*0.9这类“整批运算”的能力,就是NumPy最值得学的地方。
3. 安装 NumPy
直接安装:
pipinstallnumpy安装后可以简单检查版本:
python-c"import numpy as np; print(np.__version__)"导入方式通常这样写:
importnumpyasnpnp是NumPy的常见别名,几乎所有教程和项目都这么写。
4. 先理解 NumPy 最核心的对象:ndarray
NumPy里最重要的数据结构是ndarray,也就是多维数组。
可以先把它理解成“比 list 更适合数值运算的数组”。
先看最简单的创建方式:
importnumpyasnp arr=np.array([10,20,30,40])print(arr)print(type(arr))输出类似:
[10 20 30 40] <class 'numpy.ndarray'>二维数组也很常见:
matrix=np.array([[1,2,3],[4,5,6]])print(matrix)这时候你就可以把它看成一个2 行 3 列的数值矩阵。
5. 常见的数组创建方式
5.1 从列表创建
arr=np.array([1,2,3,4,5])5.2 创建全 0 数组
zeros=np.zeros((2,3))表示创建一个2 行 3 列的全零数组。
5.3 创建全 1 数组
ones=np.ones((3,2))5.4 创建连续数字
arr=np.arange(1,10)这会得到:
[1 2 3 4 5 6 7 8 9]5.5 创建等间距数组
arr=np.linspace(0,1,5)结果是从0到1均匀切成5个点。
6. shape、dtype、ndim 这几个属性一定要熟
NumPy数组最常用的基础信息包括:
shape:形状dtype:数据类型ndim:维度数
示例:
arr=np.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里非常高频的方法。
arr=np.arange(1,13)matrix=arr.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会很快上手,只是二维数组更常见。
arr=np.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最核心的优势之一。
arr=np.array([1,2,3,4])print(arr+10)print(arr*2)print(arr/2)输出类似:
[11 12 13 14] [2 4 6 8] [0.5 1. 1.5 2. ]也就是说,运算会直接作用到整个数组,而不是要求你手写循环逐个处理。
10. 广播机制,新手一定要先理解个大概
广播是NumPy非常经典的特性。你可以把它先简单理解成:
当不同形状的数据在某些规则下可以对齐时,NumPy 会自动帮你把较小的数据“扩展”后再计算。
最常见的例子:
prices=np.array([15,20,35,40])discount=prices*0.9print(discount)这里数组里的每个元素都会乘以0.9。
再看一个二维例子:
scores=np.array([[80,85,90],[75,88,92]])bonus=np.array([5,0,3])result=scores+bonusprint(result)这里bonus会按列广播到每一行。
新手不需要一开始就背复杂规则,但要先知道:NumPy 很多“看起来没写循环”的批量计算,本质上都和广播有关。
11. 聚合统计:sum、mean、max、min
做数据处理时,经常需要求和、均值、最大值、最小值。
sales=np.array([[1200,1500,1800],[1000,1600,1700],[900,1400,2100]])print(sales.sum())print(sales.mean())print(sales.max())print(sales.min())如果想按行或按列统计,就用axis:
print(sales.sum(axis=0))# 按列求和print(sales.mean(axis=1))# 按行求均值可以先记住:
axis=0:沿着行方向压缩,通常得到“每列结果”axis=1:沿着列方向压缩,通常得到“每行结果”
12. 条件筛选和布尔数组
NumPy做筛选非常方便。
scores=np.array([88,92,79,95,90])high_scores=scores[scores>=90]print(high_scores)输出:
[92 95 90]你也可以得到一个布尔数组:
print(scores>=90)输出类似:
[False True False True True]这类写法在做数据清洗和过滤时非常常见。
13. np.where:条件替换
如果你想根据条件生成新结果,np.where()很常用。
scores=np.array([88,92,79,95,90])levels=np.where(scores>=90,"A","B")print(levels)输出:
['B' 'A' 'B' 'A' 'A']这个函数在做标签转换、分段判断时很好用。
14. 随机数
做模拟实验、机器学习、测试数据生成时,随机数很常见。
推荐新写法:
rng=np.random.default_rng(seed=42)arr=rng.integers(0,10,size=(2,3))print(arr)这里的重点有两个:
seed=42让结果可复现size=(2, 3)表示生成一个2 行 3 列的数组
15. 矩阵乘法
NumPy当然也支持矩阵运算。
a=np.array([[1,2],[3,4]])b=np.array([[5,6],[7,8]])print(a @ b)输出:
[[19 22] [43 50]]这里的@是矩阵乘法,不是普通的逐元素乘法。
如果写成:
print(a*b)那就是对应位置逐元素相乘。
16. 一个适合新手直接运行的完整示例
为了方便你本地练习,我把常见操作整理成了一个独立脚本:
numpy_beginner_examples.py
完整代码如下:
importnumpyasnpdefmain()->None:print("1. 创建数组")scores=np.array([88,92,79,95,90])matrix=np.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 改变形状")numbers=np.arange(1,13)reshaped=numbers.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. 广播机制")prices=np.array([15,20,35,40],dtype=float)discount=prices*0.9print("prices =",prices)print("discount =",discount)print("\n6. 聚合统计")sales=np.array([[1200,1500,1800],[1000,1600,1700],[900,1400,2100],])print("sales =\n",sales)print("总销售额 =",sales.sum())print("每个月总额 =",sales.sum(axis=0))print("每个门店均值 =",sales.mean(axis=1))print("\n7. 布尔筛选")high_scores=scores[scores>=90]print("scores >= 90 ->",high_scores)print("\n8. 条件替换")levels=np.where(scores>=90,"A","B")print("levels =",levels)print("\n9. 随机数和可复现结果")rng=np.random.default_rng(seed=42)random_matrix=rng.integers(0,10,size=(2,3))print("random_matrix =\n",random_matrix)print("\n10. 矩阵乘法")a=np.array([[1,2],[3,4]])b=np.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了。