科研速递 | 花费15年众望所归!NumPy论文终登上Nature!

发布时间:2020-09-21

微信截图_20200918161246.png


NumPy 团队撰写了一篇综述文章,介绍 NumPy 的发展过程、主要特性和数组编程等。这篇文章现已发表在 Nature 上。NumPy 是什么?它是大名鼎鼎的使用 Python 进行科学计算的基础软件包,是 Python 生态系统中数据分析、机器学习、科学计算的主力军,极大简化了向量与矩阵的操作处理。除了计算外,它还包括了功能强大的 N 维数组对象;精密广播功能函数;集成 C/C++ 和 Fortran 代码的工具;强大的线性代数、傅立叶变换和随机数功能


接下来,我们来看这篇 NumPy 综述论文的详细内容(只摘取部分):(详细版论文pdf拉至文末领取)


Abstract


数组编程为访问,操纵和操作矢量,矩阵和高维数组中的数据提供了功能强大,紧凑且易于表达的语法。NumPy是Python语言的主要数组编程库。它在物理,化学,天文学,地球科学,生物学,心理学,材料科学,工程,金融和经济学等领域的研究分析流程中发挥着至关重要的作用。例如,在天文学中,NumPy是用于发现引力波1和首次对黑洞成像2的软件堆栈的重要组成部分。


在这里,我们回顾一些基本的数组概念如何导致一种简单而强大的编程范例,以组织,探索和分析科学数据。NumPy是构建科学Python生态系统的基础。它是如此普遍,以至于针对具有特殊需求的受众的几个项目已经开发了自己的类似NumPy的界面和数组对象。由于其在生态系统中的中心地位,NumPy越来越多地充当此类阵列计算库之间的互操作性层,并且与其应用程序编程接口(API)一起,提供了灵活的框架来支持未来十年的科学和工业分析。


Main


在NumPy之前存在两个Python数组程序包。Numeric软件包是在1990年代中期开发的,并使用Python提供了数组对象和数组感知功能。它被写在C和连接到线性代数的标准快速实现。它的最早用途之一是在Lawrence Livermore国家实验室进行C ++应用程序的惯性约束融合研究。为了处理来自哈勃太空望远镜的大型天文图像,重新实现了称为Numarray的数字,增加了对结构化数组的支持,灵活的索引,内存映射,字节顺序变体,更有效的内存使用,灵活的IEEE 754标准错误处理功能和更好的类型转换规则。尽管Numarray与Numeric高度兼容,但这两个软件包之间的差异足以使社区分裂。但是,在2005年,NumPy成为“两全其美”的统一7-将 Numarray的功能与Numeric的小数组性能及其丰富的C API相结合。


如今,15年过去了,NumPy的支撑着几乎每一个Python库,做科学或数值计算,其中SciPy的,Matplotlib ,熊猫,scikit学习和scikit图像。NumPy是社区开发的开放源代码库,它提供了多维Python数组对象以及对其进行操作的可感知数组的函数。由于其固有的简单性,NumPy数组是Python中数组数据的事实上的交换格式。

NumPy使用中央处理器(CPU)在内存阵列上运行。为了利用现代的专用存储和硬件,最近出现了Python数组软件包的泛滥。与Numarray-Numeric鸿沟不同,这些新库现在更难打乱用户社区,因为NumPy之上已经建立了多少工作。但是,为了使社区能够使用新的探索性技术,NumPy正在过渡到一种中央协调机制,该机制指定了定义良好的数组编程API,并在适当时将其分发给专门的数组实现。


NumPy arrays


NumPy数组是一种数据结构,可以有效地存储和访问多维数组17(也称为张量),并可以进行多种科学计算。它由指向内存的指针以及用于解释存储在其中的数据的元数据组成,尤其是“数据类型”,“形状”和“步幅”(图1a)。


5677.png



a,NumPy数组数据结构及其关联的元数据字段。b,用切片和步骤索引数组。这些操作返回原始数据的“视图”。c,用掩码,标量坐标或其他数组索引数组,以便它返回原始数据的“副本”。在下面的示例中,一个数组与其他数组建立了索引。这将在执行查找之前广播索引参数。d,向量化有效地将运算应用于元素组。e,以二维数组的乘法进行广播。F,还原操作沿一个或多个轴进行。在此示例中,将沿选择轴求和的数组相加以生成矢量,或者沿两个轴连续求和以生成标量。g,示例NumPy代码,说明了其中一些概念。


数据类型描述存储在数组中的元素的性质。数组具有单一数据类型,并且数组的每个元素在内存中占用相同数量的字节。数据类型的示例包括实数和复数(较低和较高的精度),字符串,时间戳和指向Python对象的指针。

阵列的形状确定沿每个轴的元素数,而轴数是阵列的维数。例如,数字向量可以存储为形状N的一维数组,而彩色视频是形状(T,  M,  N,3)的四维数组。


要将计算机线性存储为多维数组的计算机内存解释,必须大步向前。它们描述了要在内存中向前移动以在行与行之间,列与列之间跳转的字节数,等等。例如,考虑一个形状为(4,3)的二维浮点数数组,其中每个元素在内存中占用8个字节。要在连续的列之间移动,我们需要在内存中向前跳转8个字节,然后访问下一行3×8 = 24个字节。因此,该数组的步幅为(24,8)。NumPy可以按C或Fortran内存顺序存储数组,首先在行或列上进行迭代。这允许使用这些语言编写的外部库直接访问内存中的NumPy数组数据。


用户使用“索引”(访问子数组或单个元素),“运算符”(例如,用于矢量化运算的+,-和×和用于矩阵乘法的@)与NumPy数组进行交互;以及“可感知数组的函数”;它们共同为数组编程提供了一个易于阅读,易于表达的高级API,而NumPy则处理了提高操作速度的基本机制。

对数组建立索引将返回满足特定条件的单个元素,子数组或元素(图1b)。甚至可以使用其他数组对数组进行索引(图1c)。在可能的情况下,检索子数组的索引将在原始数组上返回一个“视图”,以便在两个数组之间共享数据。这提供了一种强大的方法来处理阵列数据的子集,同时限制了内存的使用。


为了补充数组语法,NumPy包括对数组执行矢量化计算的函数,包括算术,统计和三角函数(图1d)。向量化(对整个阵列而非单个元素进行操作)对于阵列编程至关重要。这意味着用数十种行来表示的语言(例如C语言)的操作通常可以实现为单个清晰的Python表达式。这样可以生成简洁的代码,使用户可以将精力集中在分析的细节上,而NumPy则以近乎最佳的方式处理数组元素上的循环-例如,考虑到最大程度地利用计算机的快速缓存。


在具有相同形状的两个数组上执行向量化操作(例如加法)时,很清楚会发生什么。通过“广播”,NumPy允许尺寸不同,并产生吸引直觉的结果。一个简单的示例是将标量值添加到数组,但是广播也可以推广到更复杂的示例,例如缩放数组的每一列或生成坐标网格。在广播中,一个或两个阵列实际上是重复的(即,不复制任何数据在内存中),因此操作数的形状匹配(图1d)。当使用索引数组对数组进行索引时,也会应用广播(图1c)。

其他阵列感知功能(例如求和,均值和最大值)执行逐个元素的“归约”,在单个阵列的一个,多个或所有轴上汇总结果。例如,求和的Ñ维阵列上方d的尺寸的阵列轴线结果ñ  -  d(图1F)。

NumPy还包含用于创建,重塑,连接和填充数组的数组感知功能;搜索,分类和计数数据;以及读写文件。它提供了用于产生伪随机数的广泛支持,包括概率分布的分类,并进行加速线性代数,使用几个后端诸如OpenBLAS之一在手为CPU的优化或Intel MKL(更多细节请参见补充方法) 。


总而言之,简单的内存中数组表示形式,紧密模拟数学的语法以及各种可识别数组的实用程序功能的组合形成了一种高效且功能强大的数组编程语言。


Scientific Python ecosystem


Python是一种开放源代码的通用解释型编程语言,非常适合诸如清洁数据,与Web资源交互和解析文本之类的标准编程任务。增加快速的数组运算和线性代数,使科学家能够在一种编程语言中完成所有工作,这是一种众所周知的易学易教的优势,这已被许多大学用作主要学习语言而见证。


即使NumPy不是Python标准库的一部分,它也可以从与Python开发人员的良好关系中受益。多年来,Python语言增加了新功能和特殊语法,因此NumPy将具有更简洁和易于阅读的数组表示法。但是,由于它不是标准库的一部分,因此NumPy能够规定其自己的发布策略和开发模式。


在历史,开发和使用方面,SciPy和Matplotlib与NumPy紧密结合。SciPy提供了用于科学计算的基本算法,包括数学,科学和工程例程。Matplotlib生成可发布的图形和可视化文件。NumPy,SciPy和Matplotlib的结合,以及高级交互环境(例如IPython 20或Jupyter 21),为Python中的数组编程奠定了坚实的基础。科学的Python生态系统(图2)建立在此基础之上,以提供几个,广泛用于特定技术库,这反过来背后众多特定于域的项目。NumPy是阵列感知库生态系统的基础,它设置了文档标准,提供了阵列测试基础结构,并增加了对Fortran和其他编译器的构建支持。

8899.png


依赖NumPy API的基本库和项目可以访问支持NumPy阵列协议的新阵列实现(图3)。


许多研究小组设计了大型,复杂的科学库,这些库为生态系统添加了特定于应用程序的功能。例如,eht影像库29由Event Horizon Telescope合作开发的,用于无线电干涉测量成像,分析和仿真,它依赖于科学Python生态系统的许多底层组件。特别是,EHT合作使用该库对黑洞进行了首次成像。在eht成像中,NumPy数组用于在处理链的每个步骤中存储和处理数字数据:从原始数据到校准和图像重建。SciPy提供用于一般图像处理任务(例如过滤和图像对齐)的工具,而scikit-image是扩展SciPy的图像处理库,提供了更高级别的功能,例如边缘滤镜和霍夫变换。“ scipy.optimize”模块执行数学优化。NetworkX 22,用于复杂网络分析的软件包,用于验证图像比较的一致性。Astropy 23,24个手柄标准天文文件格式,并计算时间的坐标变换。Matplotlib用于可视化数据并生成黑洞的最终图像。


由数组编程基础和周围的工具生态系统(在IPython或Jupyter内部)创建的交互式环境非常适合于探索性数据分析。用户可以流畅地检查,操纵和可视化他们的数据,并快速迭代以完善编程语句。然后将这些语句组合成命令式或功能性程序,或包含计算和叙述的笔记本。超出探索性工作的科学计算通常在文本编辑器或诸如Spyder的集成开发环境(IDE)中完成。这种丰富而高效的环境使Python在科学研究中颇受欢迎。


为了完善该工具以进行探索性工作和快速制作原型,NumPy建立了一种使用经过时间考验的软件工程实践来改善协作并减少错误的文化30。这种文化不仅被项目领导者采用,而且还热情地向新来者传授。NumPy团队很早就采用分布式修订控制和代码审查来改善代码协作,并为NumPy的每个拟议变更进行连续测试,从而运行大量自动测试。该项目还具有全面的,高质量的文件,与源代码集成31,32,33。


在NumPy上建立的图书馆生态系统已采用这种使用最佳实践来生产可靠的科学软件的文化。例如,在皇家天文学会最近颁发给Astropy的奖项中,他们指出:“ Astropy项目为数百名初级科学家提供了专业标准软件开发实践的经验,包括版本控制的使用,单元测试,代码审查和问题跟踪程序。对于现代研究人员而言,这是一项至关重要的技能,而物理学或天文学的正规大学教育通常却不具备这种技能。”  社区成员明确合作,通过课程来解决这个缺乏正规教育和研讨会。


最近数据科学,机器学习和人工智能的快速发展进一步并极大地促进了Python的科学使用。它的重要应用示例,例如eht图像库,现在几乎在自然科学和社会科学的每个学科中都有。这些工具已成为许多领域的主要软件环境。NumPy及其生态系统通常在大学课程,新兵训练营和暑期学校中教授,并且是全球社区会议和研讨会的重点。NumPy及其API已真正普及。


领取方式

由于篇幅较长,无法完全展示

论文详细版pdf

后台回复“N”即可领取

计算机观察家.jpg



X