惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Google DeepMind News
Google DeepMind News
SecWiki News
SecWiki News
V
Visual Studio Blog
博客园 - 三生石上(FineUI控件)
WordPress大学
WordPress大学
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
博客园 - 【当耐特】
Martin Fowler
Martin Fowler
宝玉的分享
宝玉的分享
F
Fortinet All Blogs
U
Unit 42
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
aimingoo的专栏
aimingoo的专栏
V
V2EX
Apple Machine Learning Research
Apple Machine Learning Research
博客园 - 聂微东
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
O
OpenAI News
T
Troy Hunt's Blog
TaoSecurity Blog
TaoSecurity Blog
小众软件
小众软件
MongoDB | Blog
MongoDB | Blog
Recent Commits to openclaw:main
Recent Commits to openclaw:main
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
L
LINUX DO - 最新话题
N
News | PayPal Newsroom
PCI Perspectives
PCI Perspectives
Engineering at Meta
Engineering at Meta
美团技术团队
J
Java Code Geeks
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
人人都是产品经理
人人都是产品经理
雷峰网
雷峰网
V
Vulnerabilities – Threatpost
B
Blog RSS Feed
NISL@THU
NISL@THU
Security Latest
Security Latest
The Register - Security
The Register - Security
酷 壳 – CoolShell
酷 壳 – CoolShell
The GitHub Blog
The GitHub Blog
S
SegmentFault 最新的问题
N
News and Events Feed by Topic
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
S
Schneier on Security
罗磊的独立博客
Know Your Adversary
Know Your Adversary
Hacker News: Ask HN
Hacker News: Ask HN
S
Security Affairs
月光博客
月光博客
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO

小陈同学 - 后端

从 requirements.txt 到 pyproject.toml:现代 Python 项目升级实战指南(含依赖分析与 Docker) 用 NumPy 玩转电影评分系统:从随机数据到洞察分析 NumPy 入门:别再用 for 循环折磨自己了 uv:用 Rust 武装的极速 Python 包管理器入门指南 NodeJs连接MongoDB以及操作方法 NodeJs基于Token的身份认证
NumPy 进阶:搞懂广播机制,才能真正玩转数组
Caleb · 2025-10-24 · via 小陈同学 - 后端

掌握广播机制是解锁 NumPy 高效数组运算的核心,它让不同形状数组自动对齐并参与向量化计算,从而带来数量级的性能飞跃。

numpy_2.png

一、前情回顾:数组的“超能力”从哪来?

上一章我们已经知道,NumPy 数组能直接做加减乘除:

import numpy as np

arr = np.array([1, 2, 3, 4, 5])
print(arr * 2)
# [ 2  4  6  8 10]

但你有没有想过,为什么这个操作不报错?

Python 原生列表可做不到这事儿。

答案就是:广播机制(Broadcasting)
NumPy 允许不同形状的数组在数学运算时“自动对齐”。

二、广播机制的核心原理

简单一句话总结:

广播就是 NumPy 在维度不匹配时自动扩展数组,使它们形状兼容。

来,我们先用一个经典例子开胃 👇

a = np.array([[1, 2, 3],
              [4, 5, 6]])

b = np.array([10, 20, 30])

print(a + b)

输出:

[14 25 36]]

看似理所当然,但实际上这背后 NumPy 悄悄做了扩展 👇

数组原始形状扩展形状
a(2, 3)(2, 3)
b(3,)(1, 3) → (2, 3)

NumPy 自动在前面补了一个维度 (1, 3),然后复制两次让它变成 (2, 3),于是它们形状一致,就能运算了!

三、广播规则总结

判断两个数组是否能广播,其实就三步:

  1. 尾部维度 开始对齐;
  2. 每个维度要么相等,要么其中一个是 1;
  3. 不满足规则时,广播失败(直接报错)。
A.shape = (4, 1, 3)
B.shape = (1, 5, 3)
# 结果 -> (4, 5, 3)
A.shape = (3, 2)
B.shape = (2, 3)
# 维度都不匹配,直接报错!

四、copy vs view:NumPy 的内存诡计

你可能遇到过这种情况 👇

arr = np.arange(6).reshape(2, 3)
sub = arr[:, 1:]
sub[0, 0] = 99

print(arr)

输出:

[[ 0 99  2]
 [ 3  4  5]]

为什么我改了 subarr 也跟着变了?

那是因为 NumPy 返回的不是拷贝(copy),而是视图(view)
两者共用底层内存,一改俱改。

🔍 如何判断是否为 view?

sub.base is arr  # True -> 表示 sub 是 arr 的视图

如果想要真正复制一份独立的副本:

sub = arr[:, 1:].copy()

五、性能优化:让你的代码飞起来 🚀

1️⃣ 避免循环

# 慢
for i in range(len(arr)):
    arr[i] *= 2

# 快
arr *= 2

循环会触发 Python 解释器逐元素执行;
而向量化运算在底层 C 实现中批量计算,速度往往快几十倍。


2️⃣ 使用 numexpr 进行表达式优化

import numexpr as ne

a = np.random.rand(10_000_000)
b = np.random.rand(10_000_000)
c = np.random.rand(10_000_000)

# 普通写法
res1 = a * b + c

# numexpr 写法
res2 = ne.evaluate("a * b + c")

numexpr 会自动进行并行和缓存优化,CPU 利用率更高。


3️⃣ 就地操作(In-place)

arr *= 2  # 就地修改,不创建新数组

这种写法可以节省内存分配,尤其在大数组时效果显著。

六、实用技巧锦集 🧰

场景方法
随机数np.random.rand(3,3)
拼接np.concatenate((a,b), axis=0)
转置arr.T
排序np.sort(arr)
求唯一值np.unique(arr)

这些都是项目中常用的“手上活儿”。

七、性能演示:到底快多少?

import time

a = list(range(10_000_000))
start = time.time()
b = [x * 2 for x in a]
print("耗时:", time.time() - start)

# 耗时: 0.13944315910339355
import numpy as np
import time

a = np.arange(10_000_000)
start = time.time()
b = a * 2
print("耗时:", time.time() - start)

# 耗时: 0.05504918098449707

实测下来:NumPy 版本比纯 Python 快 30~100 倍
一旦数据量大,优势就像核弹一样炸裂 💥。

八、小结

模块要点
广播机制自动扩展维度,按尾部对齐
内存视图view 共用底层数据,copy 独立内存
性能优化向量化、numexpr、就地操作
实用技巧拼接、随机数、转置、排序、唯一值

下一篇(第 3 篇)我们将正式上手项目实战:
用 NumPy 做 图像处理与数据分析,把理论变成肌肉记忆。

🏁 系列目录

  1. NumPy 入门:别再用 for 循环折磨自己了
  2. NumPy 进阶:搞懂广播机制,才能真正玩转数组
  3. 🔜 NumPy 实战:用数组玩转图像与数据分析

作者: 文章链接: https://reinness.com/posts/299 版权声明:  本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自小陈同学