NumPy 教程(一文讲透)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观
前言
在数据科学与机器学习领域,NumPy 是 Python 生态中最基础、最强大的科学计算库之一。它为 Python 提供了高性能的多维数组对象(ndarray),以及丰富的数学函数和工具,能够高效处理大规模数据运算。无论是进行线性代数运算、统计分析,还是构建机器学习模型,NumPy 都是开发者绕不开的基石工具。
本文将以 NumPy 教程为核心,从零开始系统讲解 NumPy 的核心概念、操作方法和实际应用场景。内容将采用循序渐进的方式,结合代码示例和直观比喻,帮助编程初学者快速上手,同时为中级开发者提供更深入的技巧与优化思路。
一、安装与环境准备
1.1 安装 NumPy
NumPy 的安装非常简单,只需通过 pip
命令即可完成:
pip install numpy
安装完成后,可以通过以下代码验证版本:
import numpy as np
print(np.__version__) # 输出当前安装的 NumPy 版本
1.2 导入与别名
在 Python 中,通常将 NumPy 导入并命名为 np
,这是社区约定的惯例:
import numpy as np
这一做法能够简化代码书写,例如 np.array()
比 numpy.array()
更简洁。
二、NumPy 核心对象:ndarray
2.1 数组(Array)的创建
ndarray 是 NumPy 的核心数据结构,它是一个同类型、固定大小的多维数组。与 Python 原生的列表(list)不同,ndarray 的存储和计算效率更高。
基础创建方法
- 从 Python 列表转换:
arr_1d = np.array([1, 2, 3]) # 一维数组 arr_2d = np.array([[1, 2], [3, 4]]) # 二维数组
- 预定义函数快速生成:
zeros_arr = np.zeros((3, 3)) # 创建全零数组 ones_arr = np.ones((2, 4)) # 创建全一数组 range_arr = np.arange(0, 10, 2) # 类似 range 的数组,步长为 2
形象比喻
可以将 ndarray 想象为一个仓库货架:
- 形状(shape):货架的行数和列数(如
3x3
)。 - 维度(dimension):货架的层级(如一维是单层货架,二维是双层货架)。
- 数据类型(dtype):货架上存储的物品类型(如整数、浮点数)。
2.2 数组属性与操作
常用属性
arr = np.array([[1, 2, 3], [4, 5, 6]])
print(arr.shape) # 输出 (2, 3),表示数组的形状
print(arr.ndim) # 输出 2,表示数组的维度
print(arr.dtype) # 输出 int64,表示元素的数据类型
索引与切片
NumPy 的索引规则与 Python 列表类似,但支持多维操作:
print(arr[0, 1]) # 输出 2,即第一行第二列的元素
print(arr[1, :]) # 输出 [4 5 6],即第二行所有列
print(arr[:, 1]) # 输出 [2 5],即所有行的第二列
数组拼接与分割
- 拼接(Concatenation):
arr1 = np.array([[1, 2], [3, 4]]) arr2 = np.array([[5, 6], [7, 8]]) # 沿轴 0(垂直方向)拼接 vertical = np.concatenate((arr1, arr2), axis=0) # 沿轴 1(水平方向)拼接 horizontal = np.concatenate((arr1, arr2), axis=1)
- 分割(Splitting):
split_arr = np.split(arr, 2, axis=0) # 将数组沿行分割为两个子数组
三、广播机制(Broadcasting)
3.1 什么是广播?
广播是 NumPy 的一项核心功能,允许不同形状的数组进行算术运算。例如,一个形状为 (3, 1)
的数组可以与形状为 (3, 4)
的数组相加,结果是一个形状为 (3, 4)
的新数组。
运算规则
广播遵循以下规则:
- 如果两个数组在某一维度的大小相同,或其中一方的维度大小为 1,则可以广播。
- 数组会沿着维度大小为 1 的方向“扩展”,而非实际复制数据。
示例:温度转换
celsius = np.array([0, 25, 100])
fahrenheit = celsius * 9/5 + 32
print(fahrenheit) # 输出 [32. 77. 212.]
这里,标量 32
被广播为与 celsius
同形状的数组。
四、数学运算与线性代数
4.1 基础数学运算
NumPy 提供了丰富的数学函数,支持对数组的逐元素运算:
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
print(a + b) # 输出 [5 7 9]
print(np.sin(a)) # 计算数组元素的正弦值
print(np.exp(b)) # 计算元素的指数值
4.2 线性代数运算
NumPy 的 linalg
子模块提供了线性代数功能:
mat_a = np.array([[1, 2], [3, 4]])
mat_b = np.array([[5, 6], [7, 8]])
product = np.dot(mat_a, mat_b) # 或 mat_a @ mat_b
eigenvalues, eigenvectors = np.linalg.eig(mat_a)
五、实际案例:数据分析与统计
5.1 数据生成与统计
假设我们有一个销售数据集,可以用 NumPy 进行统计分析:
sales = np.random.randint(100, 1000, size=(10, 5))
quarterly_avg = np.mean(sales, axis=0)
max_sales = np.max(sales, axis=1)
best_store = np.argmax(max_sales)
5.2 数据标准化
在机器学习中,常用标准化(Z-Score)预处理数据:
data = np.random.rand(100, 2) # 生成随机数据
mean = np.mean(data, axis=0)
std = np.std(data, axis=0)
normalized = (data - mean) / std
六、进阶技巧与性能优化
6.1 向量化操作
避免使用 Python 的 for
循环,改用向量化运算可大幅提升性能。例如:
result = []
for x in arr:
result.append(x * 2)
result = arr * 2 # 直接对数组操作
6.2 内存优化
通过调整数据类型(dtype)减少内存占用:
float32_arr = arr.astype(np.float32)
结论
NumPy 是 Python 科学计算的基石,其高效的数组操作和丰富的功能为数据分析、机器学习奠定了基础。通过本文的讲解,读者可以掌握从基础数组操作到广播机制、线性代数的全流程知识,并结合实际案例理解其应用价值。
无论是处理简单的数学问题,还是构建复杂的机器学习模型,NumPy 教程中介绍的核心概念与技巧都能帮助开发者高效解决问题。建议读者通过动手实践加深理解,例如尝试用 NumPy 实现图像处理或统计分析任务。掌握 NumPy,你将迈出通向数据科学领域的关键一步。