人工智能之数据分析:NumPy
第十三章 工具衔接与迁移
引言
作为 Python 科学计算的基石,NumPy 不仅具备强大的数值处理能力,还能与多种工具高效协同。本文将从两个重要角度展开系统性解析:
一、从 MATLAB 到 NumPy:语法对照与迁移策略
对于习惯使用 MATLAB 的用户而言,转向 NumPy 的主要障碍通常体现在两个方面:一是编程思维的转变(从以矩阵为核心到以数组为核心),二是语言语法上的差异。
以下为关键功能的对比说明:
核心原则
- NumPy 使用的是 数组(array) 而非 矩阵(matrix) → 所有运算默认按元素进行
- 执行矩阵乘法应使用
np.dot()或@操作符,而非* - 索引起始位置为 0,而非 1
- 切片操作不会复制数据,而是创建视图(view),实现内存共享
ndarray
matrix
@
np.dot()
*
1. 数组创建方式对比
| MATLAB | NumPy | 说明 |
|---|---|---|
| [1, 2, 3] | np.array([1, 2, 3]) | 行向量 |
| [1; 2; 3] | np.array([[1], [2], [3]]) 或 np.array([1, 2, 3]).reshape(-1, 1) | 列向量 |
| zeros(3,4) | np.zeros((3,4)) | 注意参数为元组形式 |
| ones(3,3) | np.ones((3,3)) | 一致 |
| eye(3) | np.eye(3) | 单位矩阵 |
| rand(2,3) | np.random.rand(2,3) 或 np.random.random((2,3)) | 生成 [0,1) 区间内的均匀分布随机数 |
| A(:) | A.flatten() 或 A.ravel() | 展平为一维数组 |
a = [1, 2, 3]
a = np.array([1, 2, 3])
b = [1; 2; 3]
b = np.array([[1], [2], [3]])
b = np.array([1,2,3]).reshape(-1,1)
zeros(2,3)
np.zeros((2,3))
ones(2,3)
np.ones((2,3))
eye(3)
np.eye(3)
linspace(0,1,5)
np.linspace(0,1,5)
rand(2,3)
np.random.rand(2,3)
A(:)
A.flatten()
A.ravel()
[1,2,3]
np.array([1,2,3])
补充说明:MATLAB 中 A(:) 返回的是行向量,而 NumPy 中 ravel() 得到的是一维数组(无行列方向),但在广播机制中可自动适配为行或列。
2. 索引与切片操作对比
| MATLAB | NumPy | 说明 |
|---|---|---|
| A(1,2) | A[0,1] | 索引从 0 开始 |
| A(2,:) | A[1,:] | 获取第 2 行 |
| A(:,3) | A[:,2] | 获取第 3 列 |
| A(2:end,:) | A[1:,:] | 从第 2 行至末尾 |
| A([1,3], [2,4]) | A[np.ix_([0,2], [1,3])] 或 A[[0,2]][:,[1,3]] | 花式索引(返回副本) |
| A(A>0) | A[A>0] | 布尔索引(行为一致) |
A(2,3)
A[1,2]
A(2,:)
A[1,:]
A(:,3)
A[:,2]
A(2:end, :)
A[1:, :]
A([1,3], :)
A[[0,2], :]
A(A>0.5)
A[A>0.5]
布尔索引转换示例:
MATLAB 中的逻辑表达式 A > 0 在 NumPy 中同样写为 A > 0,但访问方式如下:
A > 0 → A[A > 0]
A == 5 → A[A == 5]
end
-1
A(:, end)
A[:, -1]
A(2:end-1, :)
A[1:-1, :]
3. 运算与函数对照表
| 操作类型 | MATLAB | NumPy |
|---|---|---|
| 矩阵乘法 | A * B | np.dot(A, B) 或 A @ B |
| 逐元素乘法 | A .* B | A * B |
| 转置(非共轭) | A.' | A.T |
| 共轭转置 | A' | A.conj().T 或 np.conjugate(A).T |
| 求逆 | inv(A) | np.linalg.inv(A) |
| 解线性方程 Ax=b | A \ b | np.linalg.solve(A, b) |
| 特征值分解 | eig(A) | np.linalg.eig(A) |
| 快速傅里叶变换 FFT | fft(x) | np.fft.fft(x) |
| 最大值(按列) | max(A) | np.max(A, axis=0) |
| 水平拼接 | [A, B] | np.hstack([A, B]) 或 np.concatenate([A, B], axis=1) |
| 垂直拼接 | [A; B] | np.vstack([A, B]) 或 np.concatenate([A, B], axis=0) |
A * B
A @ B
np.dot(A, B)
A .* B
A.'
A'
A.T
A.conj().T
inv(A)
np.linalg.inv(A)
A \ b
np.linalg.solve(A, b)
[V,D] = eig(A)
eigvals, eigvecs = np.linalg.eig(A)
fft(x)
np.fft.fft(x)
max(A)
np.max(A, axis=0)
[A, B]
[A; B]
np.hstack([A,B])``np.vstack([A,B])
4. 控制结构与脚本组织方式
- MATLAB 脚本文件 → Python 脚本文件(
.m→.py) - MATLAB 函数定义 → Python 函数定义(
function→def) - MATLAB 中的
clear,close all等命令在 Python 中无需显式调用,因内存由解释器自动管理
示例代码对比:
% MATLAB
function y = myfunc(x)
y = x.^2 + 2*x + 1;
end
# Python
def myfunc(x):
return x**2 + 2*x + 1
.py
def func(...):
clear
clc
5. 常见问题及应对方案
| 问题类型 | MATLAB 行为 | NumPy 行为 | 解决方案 |
|---|---|---|---|
* 操作符含义 |
矩阵乘法 | 逐元素相乘 | 改用 np.dot() 或 @ |
| 向量维度处理 | 明确区分行/列向量 | 一维数组无方向性 | 需要列向量时使用 reshape(-1, 1) |
| 整数除法 | 结果可能为浮点 | Python 3 中 / 总是浮点除法 |
无兼容问题 |
| 索引越界 | 报错 | 报错 | 行为一致 |
| 默认浮点类型 | double | float64 | 基本一致 |
A * B
.reshape(-1,1)
5/2 = 2.5
double
float64
二、NumPy 与 Matplotlib:科学可视化的理想搭档
Matplotlib 是 Python 中最主流的可视化库,与 NumPy 实现了深度集成,二者结合构成了数据分析的标准工作流。
1. 基础绘图流程
import numpy as np
import matplotlib.pyplot as plt
# 使用 NumPy 生成数据
x = np.linspace(0, 2*np.pi, 100)
y = np.sin(x)
# 利用 Matplotlib 绘制图形
plt.plot(x, y, label='sin(x)')
plt.xlabel('x')
plt.ylabel('y')
plt.title('Sine Wave')
plt.legend()
plt.grid(True)
plt.show()
关键要点:Matplotlib 可直接接收 NumPy 数组作为输入参数,无需额外转换,极大提升了数据流转效率。
2. 常见图表类型与 NumPy 数据配合使用
(1) 散点图(Scatter Plot)
x = np.random.randn(100)
y = np.random.randn(100)
colors = np.random.rand(100)
plt.scatter(x, y, c=colors)
plt.colorbar()
plt.show()
A * B
A @ B(1) 散点图绘制(scatter) 使用随机生成的尺寸数组来控制散点大小,实现可视化效果: sizes = 1000 * np.random.rand(100) plt.scatter(x, y, c=colors, s=sizes, alpha=0.5) plt.colorbar() plt.show() (2) 图像数据展示(imshow) 适用于热力图或图像类二维数据的呈现方式: data = np.random.rand(10, 10) plt.imshow(data, cmap='hot', interpolation='nearest') plt.colorbar() plt.show()(3) 直方图构建 基于正态分布数据生成频率分布图: data = np.random.normal(0, 1, 1000) plt.hist(data, bins=30, alpha=0.7) plt.show() (4) 三维曲面绘图(需导入 mpl_toolkits 模块) 通过网格化坐标生成复杂曲面图形: from mpl_toolkits.mplot3d import Axes3D x = np.linspace(-5, 5, 50) y = np.linspace(-5, 5, 50) X, Y = np.meshgrid(x, y) # 利用广播机制创建坐标网格 Z = np.sin(np.sqrt(X**2 + Y**2)) fig = plt.figure() ax = fig.add_subplot(111, projection='3d') ax.plot_surface(X, Y, Z, cmap='viridis') plt.show() 上述方法是连接 NumPy 数值计算与二维、三维图形显示的核心手段。 3. 进阶应用:结构化数组结合 Matplotlib 可视化 定义带有字段名的结构化数据类型,并进行城市气象数据绘图: dt = np.dtype([('city', 'U10'), ('temp', 'f4'), ('humidity', 'f4')]) weather = np.array([ ('Beijing', 30.0, 40.0), ('Shanghai', 35.0, 70.0), ('Guangzhou', 33.0, 80.0) ], dtype=dt) # 绘制各城市的温度柱状图 plt.bar(weather['city'], weather['temp']) plt.ylabel('Temperature (°C)') plt.show()np.meshgrid()4. 性能优化建议 ● 避免在循环中逐点绘图 应优先采用向量化操作一次性传递全部数据: # 不推荐:效率较低 for i in range(len(x)): plt.plot(x[i], y[i], 'o') # 推荐:高效处理整个数组 plt.plot(x, y, 'o') ● 处理大规模数据时的策略 建议使用降采样技术或聚合处理以提升渲染效率plt.plot(..., rasterized=True)三、常用科学计算工具与 NumPy 的集成关系 | 工具 | 与 NumPy 的关联说明 | |-----------------|----------------------| | Pandas | DataFrame 底层由 NumPy 数组支撑;调用 `.values` 或 `.to_numpy()` 可返回 ndarray | | SciPy | 构建于 NumPy 基础之上,提供高级数学功能如积分、优化和信号处理等 | | scikit-learn | 模型输入要求为标准格式的 NumPy 数组 | | TensorFlow / PyTorch | 张量与 NumPy 数组之间可无缝转换(通过 .numpy() 和 torch.from_numpy 等方法) | | OpenCV | 图像以 H×W×C 格式的 NumPy 数组存储,支持直接像素级操作 |df.values(n_samples, n_features).numpy()四、从 MATLAB 向 NumPy 迁移的关键检查清单 - 将矩阵乘法运算符替换:使用torch.from_numpy()@或np.dot()替代 MATLAB 中的*→*- 数组索引从 0 开始:原 MATLAB 的 1-based 索引需调整为 0-based@→A(1,:)- 使用A[0,:]np.concatenate()而非cat进行数组拼接vsnp.zeros((m,n))- 用zeros(m,n)np.vstack()或np.hstack()替代vertcat和horzcat代替np.linalg.solve(A,b)- 使用A\bnp.expand_dims()或np.reshape()管理维度变化/np.arange()替代np.linspace()- 数组转置操作使用:.T或np.transpose()/np.newaxis替代reshape/np.save()- 元素级乘法使用np.load()*,而矩阵乘法使用@/save总结要点 ● MATLAB 到 NumPy 的迁移过程中,虽然语法相近,但需特别注意索引起点、乘法含义及维度管理等差异。 ● NumPy 与 Matplotlib 的组合构成了科学数据可视化的主流方案,其核心理念是“数组即数据”,无需额外格式转换即可直接绘图。 ● NumPy 作为 Python 科学计算生态的基础,能够与 Pandas、SciPy 以及主流深度学习框架实现无缝协作。 建议新项目直接采用 NumPy + Matplotlib + Jupyter Notebook 技术栈,开发体验优于传统 MATLAB 环境。load
以下是一系列关于机器学习、深度学习、自然语言处理、计算机视觉以及人工智能前沿技术的权威书籍和实用指南,内容涵盖理论基础与实战应用,适合不同层次的学习者和研究人员参考:
《模式识别(第四版)》系统地介绍了模式识别的基本概念与方法,涵盖了统计模式识别、结构模式识别等核心内容,是该领域的重要参考书之一。
ndarray
《深度学习 deep learning》(又称“花书”),由伊恩·古德费洛等人撰写,全面阐述了深度学习的数学基础、模型架构及优化策略,被广泛视为该领域的经典教材。
matrix
《Python深度学习第二版(中文版)》(Francois Chollet 著)以Keras框架为核心,深入讲解如何使用Python构建深度学习模型,强调实践与直觉理解的结合,适合初学者与开发者阅读。
@
《深入浅出神经网络与深度学习》由迈克尔·尼尔森(Michael Nielsen)编写,通过直观的方式引导读者理解神经网络的工作原理,配合代码示例帮助掌握反向传播、梯度下降等关键技术。
np.dot()
《Sklearn与TensorFlow机器学习实用指南》详细介绍了如何利用Scikit-learn和TensorFlow两大主流工具进行机器学习建模,从传统算法过渡到深度学习,具有很强的工程指导性。
*
《TensorFlow机器学习实战指南》聚焦于TensorFlow平台的实际应用,提供大量可运行的案例,帮助读者快速上手并应用于真实项目中。
a = [1, 2, 3]
《自然语言处理综论 第2版》全面覆盖自然语言处理的核心任务与技术,包括句法分析、语义理解、机器翻译等,是NLP领域的系统性经典著作。
a = np.array([1, 2, 3])
《Natural-Language-Processing-with-PyTorch》则侧重于使用PyTorch框架实现现代NLP模型,如RNN、注意力机制与Transformer,适合希望动手实践的研究人员和工程师。
b = [1; 2; 3]
《计算机视觉-算法与应用(中文版)》系统介绍图像处理、特征提取、三维重建等计算机视觉核心技术,理论与实际案例并重,是该领域的重要入门与进阶读物。
b = np.array([[1], [2], [3]])
《Learning OpenCV 4》深入讲解OpenCV 4版本的功能与应用,涵盖图像处理、对象检测、深度学习集成等内容,是开发视觉应用不可或缺的技术手册。
b = np.array([1,2,3]).reshape(-1,1)
《AIGC:智能创作时代》由杜雨与张孜铭合著,探讨生成式人工智能的发展趋势及其在内容创作中的广泛应用,展现AI在艺术、媒体等领域的变革力量。
zeros(2,3)
《AIGC原理与实践:零基础学大语言模型、扩散模型和多模态模型》系统解析当前主流的生成式模型技术,包括大语言模型、扩散模型及多模态架构,适合希望从基础入手掌握AIGC技术的读者。
np.zeros((2,3))
《从零构建大语言模型(中文版)》带领读者逐步实现一个完整的语言模型,涵盖数据预处理、模型设计、训练优化等全过程,强调自主构建能力的培养。
ones(2,3)
《实战AI大模型》聚焦于大规模人工智能模型的部署与应用,结合实际场景讲解模型微调、推理优化与工程落地的关键问题。
np.ones((2,3))
《AI 3.0》展望人工智能的未来发展路径,探讨AI在复杂环境下的认知能力提升与通用智能的可能性,兼具技术深度与哲学思考。
eye(3)

雷达卡


京公网安备 11010802022788号







