1. JAX数组基础:从NumPy到加速计算
JAX数组是高性能数值计算的核心数据结构,它继承了NumPy数组的易用性,同时针对现代硬件加速器进行了深度优化。我第一次接触JAX时,最惊讶的是它能在保持NumPy API风格的同时,实现GPU/TPU上的自动并行计算。这种设计哲学让科研人员和工程师能够无缝迁移现有代码,立即获得性能提升。
JAX数组的核心特点是"一次编写,随处运行"——同一段代码可以在CPU、GPU或TPU上执行,无需修改算法实现。这得益于JAX的底层设计:
- 基于XLA编译器优化计算图
- 自动化的设备内存管理
- 延迟执行机制(lazy evaluation)
注意:虽然API与NumPy相似,但JAX数组是 immutable(不可变)的。任何修改操作(如索引赋值)都会返回新数组而非修改原数组。这是函数式编程设计的关键,也是初学者最容易踩坑的地方。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. JAX数组的创建与基础操作
2.1 数组创建方法
JAX提供了多种数组创建方式,最常用的是通过jax.numpy模块(通常简写为jnp):
python复制import jax.numpy as jnp
# 从Python列表创建
arr1 = jnp.array([1, 2, 3])
# 特殊矩阵创建
zeros = jnp.zeros((3, 3)) # 全零矩阵
eye = jnp.eye(5) # 单位矩阵
random = jax.random.normal(jax.random.PRNGKey(0), (100,)) # 随机数组
与NumPy不同,JAX的随机数生成需要显式管理随机状态(PRNGKey)。这种设计虽然增加了些许复杂度,但保证了计算的可复现性和并行安全性。
2.2 核心操作特性
JAX数组支持所有常见的NumPy操作,但有几个关键区别:
- 设备存储透明化:数组可能存储在CPU/GPU/TPU上,但API调用方式完全一致
- 异步计算:操作可能不会立即执行,而是加入计算流等待优化
- 自动分片:大数组会自动分布在多个设备上(通过Sharding机制)
一个典型的数据处理流程示例:
python复制def process_da
