NumPy 是什么?它是大名鼎鼎的运用 Python 停止迷信计算的基础软件包,是 Python 生态系统中数据剖析、机器学习、迷信计算的主力军,极大简化了向量与矩阵的操作处置。除了计算外,它还包括了:
功用弱小的 N 维数组对象。
精细播送功用函数。
集成 C/C++ 和 Fortran 代码的工具。
弱小的线性代数、傅立叶变换和随机数功用
昔日,NumPy 中心开发团队的论文终于在 Nature 上宣布,详细引见了运用 NumPy 的数组编程(Array programming)。这篇综述论文的宣布距离 NumPy 降生曾经过去了 15 年。
NumPy 官方团队在 Twitter 上简明概括了这篇论文的中心内容:
NumPy 为数组编程提供了简明易懂、表达力强的初级 API,同时还思索了维持快速运算的底层机制。
NumPy 提供的数组编程基础和生态系统中的少量工具结合,构成了适宜探求性数据剖析的完美交互环境。NumPy 还包括增强与 PyTorch、Dask 和 JAX 等外部库互操作性的协议。
基于这些特性,NumPy 为张量计算提供了标准的 API,成为 Python 中不同数组技术之间的中心协调机制。
接上去,我们来看这篇 NumPy 综述论文的详细内容。
论文摘要
数组编程为拜访、操纵和计算向量、矩阵和高维数组中的数据提供了功用弱小、紧凑且表达力强的语法。NumPy 是 Python 言语的主要数组编程库,它在物理、化学、天文学、地球迷信、生物学、心思学、材料迷信、工程学、金融和经济学等范围的研讨剖析中都起着至关重要的作用。例如,在天文学中,NumPy 是发现引力波和黑洞初次成像的软件栈中的重要部分。
这篇论文回忆了一些基本的数组概念,以及它们如何构成一种复杂而弱小的编程范式,使其可以用于组织、探求和剖析迷信数据。NumPy 是构建迷信 Python 生态系统的基础。它的运用十分普遍,一些面向特殊需求受众的项目曾经开收回本人的类 NumPy 接口和数组对象。
由于其在 Python 生态系统中的中心肠位,NumPy 越来越多地充任数组计算库之间的互操作层,并且和其 API 一同提供了灵敏的框架,以支持未来十年的迷信和工业剖析。
NumPy 的演化史
在 NumPy 之前,曾经出现了两个 Python 数组包。Numeric 包开发于 20 世纪 90 年代中期,它提供了 Python 中的数组对象和 array-aware 函数。Numeric 是用 C 言语写的,并链接到线性代数的标准快速完成。其最早的运用之一是美国劳伦斯利弗莫尔国度实验室的惯性约束核聚变研讨。
为了处置来自哈勃太空望远镜的大型天文图像,Numeric 被重完成为 Numarray,它添加了对结构化数组、灵敏 indexing、内存映射、字节序变体、更高效的内存运用以及更好的类型转换规则的支持。
虽然 Numarray 与 Numeric 高度兼容,但这两个包之间的差异足以将社区开发者分为两类。而 2005 年,NumPy 的出现完美地一致了这两个包,它将 Numarray 的功用和 Numeric 的 small-array 功用及其丰厚的 C API 结合起来。
如今,15 年过去了,NumPy 简直支持一切停止迷信和数值计算的 Python 库(包括 SciPy、Matplotlib、pandas、scikit-learn 和 scikit-image)。NumPy 是一个社区开发的开源库,它提供了多维 Python 数组对象以及对其停止操作的 array-aware 函数。由于其固有的繁复性,理想上 NumPy 数组曾经成为 Python 中数组数据的交流格式。
NumPy 运用 CPU 对内存内(in-memory)数组停止操作。为了应用现代的公用存储和硬件,最近曾经扩展出一系列 Python 数组包。与 Numarray–Numeric 之间存在较大差异的状况不同,如今的这些新库很难在社区开发者中惹起分歧,由于它们都是树立在 NumPy 之上的。但是,为了使社区可以运用新的探求性技术,NumPy 正在过渡为中心协调机制,该机制规划了良好定义的数组编程 API,并在适宜的时分将其分发给专门的数组完成。
NumPy 数组
NumPy 数组是一种可以高效存储和拜访多维数组的数据结构,支持普遍类型的迷信计算。NumPy 数组包括指针和用于解释存储数据的元数据,即 data type(数据类型)、shape(外形)和 strides(步幅),参见下图 1a。
数据类型描画了数组中存储元素的本质。一个数组只要一个数据类型,数组中的每个元素在内存中占用的字节数是一样的。数据类型包括实数、双数、字符串、timestamp 和指针等。
数组的外形决议了每个轴上的元素数量,轴的数量即为数组的维数。例如,数字向量可存储为外形为 N 的一维数组,而彩色视频是外形为 (T, M, N, 3) 的四维数组。
步幅是解释计算机内存的必要组件,它可以线性地存储元素。步幅描画了在内存中逐行逐列移动时所需的字节数。例如,外形为 (4, 3) 的二维浮点数数组,它其中的每个元素均在内存中占用 8 个字节数。要想在延续列之间移动,我们需求在内存中行进 8 个字节数,要想抵达下一行,则需求行进 3 × 8 = 24 个字节数。因此该数组的步幅为 (24, 8)。NumPy 可以用 C 或 Fortran 的内存顺序存储数组,沿着行或列遍历。这使得运用这些言语写的外部库可以直接拜访内存中的 NumPy 数组数据。
用户运用「indexing」(拜访子数组或单个元素)、「operators」(各种运算符)和「array-aware function」与 NumPy 数组停止交互。它们为 NumPy 数组编程提供了简明易懂、表达力强的初级 API,同时还思索了维持快速运算的底层机制。
对数组执行 indexing 将前往单个元素、子数组或满足特定条件的元素(参见上图 1b)。数组甚至还可以用其他数组停止 indexing(参加图 1c)。前往子数组的 indexing 还可以前往原始数组的「view」,以便在两个数组之间共享数据。这就为内存有限的状况下基于数组数据子集停止运算提供了一种弱小的方式。
为了补充数组语法,NumPy 还包括对数组执行向量化计算的函数,包括 arithmetic、statistics 和 trigonometry(参见图 1d)。向量化计算基于整个数组运转而不是其中的单个元素,这关于数组编程而言是必要的。这意味着,在 C 等言语中需求几十行才能表达的运算在这里只需一个明晰的 Python 表达式即可完成。这就带来了繁复的代码,并使得用户不必关注剖析细节,同时 NumPy 以接近最优的方式循环遍历数组元素。
(责任编辑:admin)