讲师中心 微信公众号
AI工具推荐 视频效率加速

怎样在Python中利用Numpy进行科学计算以替代繁琐的循环?

老萱吖_3238

老萱吖_3238

发布时间:2026-07-02 10:00:20

|

794人浏览过

|

来源于php中文网

原创

np.vectorize 不是真正替代循环的好办法,因为它只是语法糖,底层仍为 Python 循环,无编译、并行或 SIMD 优化;真实加速应依赖 NumPy 广播和内置函数。

怎样在python中利用numpy进行科学计算以替代繁琐的循环?

为什么用 np.vectorize 不是真正替代循环的好办法

很多人第一反应是用 np.vectorize 把函数“向量化”,但它只是语法糖,底层仍是 Python 循环,性能几乎不提升,甚至更慢。它不编译、不并行、不利用 SIMD,纯属方便调试或快速原型。

  • 真实加速靠的是 NumPy 原生广播(broadcasting)和内置函数,比如 np.sum、np.where、np.dot
  • np.vectorize 适合处理无法直接广播的标量逻辑(如自定义分段函数),但必须加 cache=True 避免重复编译开销
  • 若函数含 if/else 或异常分支,优先改写为 np.where + 布尔索引,而非依赖 np.vectorize

用布尔索引 + np.where 替代 for + if

循环中常见“按条件修改数组元素”,比如把负数置零、对某范围值做缩放——这类操作用布尔索引一行就能完成,且零拷贝、全 C 实现。

arr = np.array([-2, -1, 0, 1, 2])
# ❌ 不要这样
for i in range(len(arr)):
    if arr[i] < 0:
        arr[i] = 0
<h1>✅ 这样写</h1><p>arr[arr < 0] = 0</p><h1>更复杂逻辑用 np.where</h1><p>arr = np.where(arr < 0, 0, np.where(arr > 1, 1, arr))

立即学习“Python免费学习笔记(深入)”;

  • 布尔索引 arr 返回布尔数组,直接用于赋值,避免显式循环
  • np.where 支持三元操作,嵌套时注意括号层级,避免误写成 np.where(cond, a, np.where(...))
  • 所有条件表达式都应作用于整个数组,不能混用标量比较(如 arr[i] )

用 np.einsum 替代多层嵌套点积或求和

当循环涉及张量收缩(比如矩阵乘法变体、批量内积、高维求和),np.einsum 是最接近数学表达的写法,且通常比 np.dot 或 np.matmul 更灵活、更易读。

testing-python
testing-python

使用pytest编写和评估有效的Python测试。适用于编写测试、审查测试代码、调试测试失败或提高测试覆盖率。

下载
# 批量向量内积:(N, D) × (N, D) → (N,)
a = np.random.randn(1000, 5)
b = np.random.randn(1000, 5)
# ❌ 循环写法慢且冗长
# res = np.array([np.dot(a[i], b[i]) for i in range(len(a))])
<h1>✅ einsum 一行搞定</h1><p>res = np.einsum('ij,ij->i', a, b)</p><h1>矩阵转置+乘法等价于 np.dot(a.T, b),但更明确</h1><p>res2 = np.einsum('ji,jk->ik', a, b)
  • 下标字符串里重复字母表示求和轴,-> 后指定输出维度
  • 避免在热路径中动态构造下标字符串(如 f'...{i}...'),会触发重新解析,性能下降
  • 小数组(einsum 和 dot 差距不大;大数组且模式固定时,einsum 可开启优化 optimize=True

用 np.ufunc 的 accumulate 或 reduceat 替代累积/分组循环

累加、滑动窗口、按索引分组聚合——这些常见模式都有对应 ufunc 方法,比手写循环稳定且快得多。

# 滑动窗口求和(窗口大小 3)
x = np.array([1, 2, 3, 4, 5])
# ❌ 手写循环
# res = [sum(x[i:i+3]) for i in range(len(x)-2)]
<h1>✅ 用 convolve(本质是卷积,但语义清晰)</h1><p>np.convolve(x, np.ones(3), mode='valid')</p><h1>分组求和:indices = [0, 2, 4] 表示分组边界 [0:2], [2:4], [4:]</h1><p>indices = [0, 2, 4, 5]
np.add.reduceat(x, indices[:-1], axis=0)
  • np.add.reduceat 要求 indices 严格递增,且末尾需补一个超出范围的值(如 len(arr))才能覆盖最后一组
  • np.convolve 默认 full 模式,用 mode='valid' 才等效于滑动窗口无填充
  • 不是所有 ufunc 都支持 reduceat,只有可结合运算(add、multiply、minimum、maximum)才可用

真正能甩开循环的,从来不是某个函数名,而是理解“数组即数据结构”这个前提——所有操作都该以整块内存为单位思考,而不是把它当成装数字的盒子再一个个掏出来。广播规则、内存连续性、ufunc 的底层实现细节,这些才是决定你写出来的代码是快还是假快的关键。

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

1671

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

4224

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1669

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

24557

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

3007

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

3027

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

1163

2023.08.11

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

596

2023.08.10

C++运算符基础入门
C++运算符基础入门

本专题详细讲解了C++运算符的类型、语法与使用方法,涵盖算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符、条件运算符及其他特殊运算符,并通过代码示例解析优先级与结合性。

0

2026.10.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn