图解NumPy:常用函数的内在机制

📅 2026/8/27 20:54:00
图解NumPy:常用函数的内在机制
许多机器学习开发者以及研究者必备的工具, 是支持大量多维数组与矩阵运算的NumPy软件库本文会借助直观易懂的图示, 对常用的NumPy功能跟函数予以解析, 助力你理解NumPy操作数组的内在机制。NumPy乃基础软件库, 诸多常用数据处理软件库皆用之或受其启发, 涵盖Keras等, 理解NumPy运转机制可助于你提升在这些软件库上的技能加之于GPU运用NumPy时勿需修改或只需极少修改代码。NumPy 的核心概念所在是 n 维数组, n 维数组具备的美丽之处在于, 大多数运算呈现出看上去都一样的情形, 不论数组拥有多少维, 然而一维与二维存在着些许特殊之处, 本文划分成三部分:1. 向量一维数组2. 矩阵二维数组3. 三维及更高维本文参照了 Jay 的《A Intro to NumPy》这篇文章, 把它当作起始点, 接着予以扩充, 还做了少数细微的修改。NumPy 数组和 列表初见之时, NumPy数组跟列表相像, 它们都能当作容器, 能急速获取以及设定元素, 然而插入还有移除元素会稍微慢一点儿。NumPy 数组完胜列表的最简单例子是算术运算除此之外NumPy 数组的优势和特点还包括更紧凑尤其是当维度大于一维时当运算可以向量化时速度比列表更快当在后面附加元素时速度比列表慢通常是同质的当元素都是一种类型时速度很快。在这里, O(N)所表达的含义表明, 完成该运算需要的 时间, 和数组的大小, 呈现出成正比的关系, 然而, O*(1)也就是所谓的「均摊O(1)」, 它所表达的意思是, 完成运算的时间, 通常情况下, 和数组的大小, 并无关联。向量一维数组向量初始化有一种方法是转换列表, 以此来创建NumPy数组NumPy数组类型能够直接依据列表元素类型推导得出。得保证往其输入的那个列表是属于同一种类型的, 倘若不然, 你最后就会得到dtype , 而这是会对速度造成影响的, 最终仅仅剩下NumPy当中所包含的那些语法糖。NumPy数组没法像列表那样去增长, 数组末端不存在任何能便于快速附加元素的空间, 所以, 常常采用的做法是, 要么一开始使用列表, 等准备妥当后再把它转成NumPy数组, 要么是运用np.zeros或者np.empty预先留出必要的空间:于多数情况而言, 我们存有这样一种需求, 即去构建出空数组, 该空数组在形状以及元素类型方面, 要与已有的数组达成匹配。实际上, 凡是用以创建填充了常量值的数组的函数, 皆带有 _like 的样式, 没错吧:NumPy 中有两个函数能用单调序列执行数组初始化如果你需要类似0., 1., 2.这种浮点数构成的数组, 你能够去修改输出的类型即为: (3).(float), 然而还存在着一种更为优良的办法。函数对于类型是极为敏感的: 要是你把整型数当作参数进行输入, 那么它就会生成整型数要是你输入的是浮点数就像(3.)这样, 那么它就会生成浮点数。但 并不非常擅长处理浮点数在我们观念里, 这个零点一看起来仿佛是个有限的十进制数, 然而计算机却并非如此看待。于二进制表示情形下, 零点一是个无限分数, 所以必定要进行约分, 进而必然会生成误差。也正由于这个缘故, 要是给函数输入带着分数部分的步长, 通常难以获得良好结果: 可能会遭遇差一错误。能够让该区间的末端落在一个非整数的步长数当中, 不过这会致使代码的可读性以及可维护性下降。在这个时候, 它便能够发挥作用了。它不会受到舍入情况的干扰, 始终都能够产生你所要求的元素数值。然而, 在运用它的时候会碰到一个较为常见的陷阱: 它所统计的是数据点的个数, 并非区间, 所以其最后一个参数num普遍要比你心里所想的数大1, 故而, 上面最后一个例子里的数是11, 并非10。在进行测试时我们通常需要生成随机数组向量索引一旦, 你的数组之中, 有了数据, NumPy就能够, 以非常巧妙的方式, 轻松地, 提供它们:所有索引方法, 除了「花式索引fancy」外, 上面给出的它们都被称作「view」, 它们这其中并不存储数据, 并且在数据被索引以后, 当发生改变时也不会展现出反映原数组的变化状况。花式索引所涵盖的全部方法皆具备可变性, 它们能够经由分配方式对原始数组的内容予以修改像上面所呈现的那样。通过把数组划分成有别于其他部分的方式, 这一功能能够防止总是存在 copy 数组的惯常做法。列表与 NumPy 数组的对比目的为了得到 NumPy 数组当中的数据, 另外一种具备超级实用性的办法是布尔索引, 其可支持运用各种各样的逻辑运算符:any 和 all 的作用与在 中类似但不会短路。不过要注意这里不支持 的「三元比较」比如 3