Skip to content

Latest commit

 

History

History
17 lines (9 loc) · 2.34 KB

File metadata and controls

17 lines (9 loc) · 2.34 KB

I don’t like NumPy

TL;DR

文章指出,NumPy虽简化基础数组运算,但其广播机制与维度操作规则在处理高维复杂计算(如多矩阵批量求解、多头自注意力机制)时存在设计缺陷,导致开发者需依赖晦涩的维度扩展、einsum或np.tensordot等非直观方式,易引发错误且难以维护。由于缺乏显式维度控制语法,函数抽象困难,代码可读性与灵活性受阻。作者计划开发新方案以保留计算能力并修正核心设计缺陷。

Summary

文章指出NumPy虽然让基础数组运算变得简洁优雅,但在处理复杂多维操作时存在明显缺陷。当需要对100个5×5矩阵进行批量求解时,必须通过试错来排列维度参数,而非直接使用循环。作者认为其核心问题源于广播机制的设计:虽然广播能简化小规模计算,但导致更高维运算必须通过扭曲的维度拓展(如使用None插入轴)或不直观的函数(例如np.tensordot)实现,且难以保证代码正确性。例如,计算Dkn = (∑lm Aklm Bln Ckm)/(LM) 需要进行多层记号操作,容易引入错误。索引规则更被批评为晦涩难懂,如示例中对10×20×30×40数组的多维索引操作,不同AI系统均出现理解偏差,说明维度逻辑在NumPy中缺乏清晰表达。

数组运算函数的设计进一步加剧问题:np.linalg.solve等函数无法通过添加参数或重组维度灵活适配不同输入结构,开发者需要混合使用转置、einsum及广播规则来实现本可通过循环解决的任务。以多头自注意力机制为例,向量化实现需要编写复杂且不直观的einsum表达式及维度重塑,而使用循环的代码虽效率低但更易读。

作者归结问题根源在于NumPy抛弃数组索引的显式表达,转而依靠广播的隐式规则导致的死板设计,使得函数抽象变得困难。尽管einsum部分弥补了抗索引法的不足,却无法应用于所有函数(如np.linalg.einsolve并不存在)。最终指出,缺乏对维度操作的显式语言支持是NumPy的致命缺陷,其最终带来的代码混乱已反噬早期设计优势。文章结尾透露作者将开发新方案以解决这些问题,强调保留NumPy的运算能力但修正核心设计中的缺陷。