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,则可以广播。
  2. 数组会沿着维度大小为 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,你将迈出通向数据科学领域的关键一步。

最新发布