NumPy

✍ dations ◷ 2025-08-22 04:53:26 #NumPy

NumPy是Python语言的一个扩展程序库。支持高阶大规模的多维数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。NumPy的前身Numeric最早是由Jim Hugunin与其它协作者共同开发,2005年,Travis Oliphant在Numeric中结合了另一个同性质的程序库Numarray的特色,并加入了其它扩展而开发了NumPy。NumPy为开放源代码并且由许多协作者共同维护开发。

尽管很早就受到了科学界和工业界的关注,但Python最初并不是为数值计算设计的。1995年,特殊兴趣小组(Special Interest Group,SIG)Matrix-sig成立,其目的是设计一个数组计算包。Matrix-sig的成员中有Python的设计者和维护者吉多·范罗苏姆,他扩展了Python的语法(特别是索引语法),使数组计算更容易。

矩阵包Numeric由Jim Fulton实现,并由Jim Hugunin推广, (也称Numerical Python extensions或 NumPy)。Jim Hugunin 是麻省理工学院的研究生,:10 于1997年加入国家研究计划公司(英语:Corporation_for_National_Research_Initiatives)从事JPython的研发,劳伦斯利弗莫尔国家实验室的Paul Dubois接任维护者。:10其他早期贡献者包括David Ascher, Konrad Hinsen和Travis Oliphant。:10

Numarray是作为Numeric的替代品被开发出来的,现已废弃。相比于Numeric,Numarray处理大数组速度较快,然而处理小数组速度较慢,因此有一段时间这两个包被并行使用于不同情况。Numeric的最后一个版本(v24.2)于2005年11月11日发布;Numarray的最后一个版本(v1.5.2)于2006年8月24日发布。

有人希望将Numeric纳入Python标准库,但吉多·范罗苏姆认为,在当时的情况下,代码难以维护。

2005年初,NumPy的开发者Travis Oliphant希望社区的不同数组包可以统一。他将Numarray的功能移植到Numeric上,并于2006将结果作为NumPy 1.0发布。这个新项目是SciPy的一部分。为了避免在只需数组计算的情况下安装庞大的SciPy包,新包以NumPy的名义被分离出来。2011年,NumPy的1.5.0版本加入了对Python 3的支持。

2011年,PyPy开始开发NumPy API,但它尚未与NumPy完全兼容。

NumPy参考CPython(一个使用字节码的解释器),而在这个Python实现解释器上所写的数学算法代码通常远比编译过的相同代码要来得慢。为了解决这个难题,NumPy引入了多维数组以及可以直接有效率地操作多维数组的函数与运算符。因此在NumPy上只要能被表示为针对数组或矩阵运算的算法,其执行效率几乎都可以与编译过的等效C语言代码一样快。

NumPy提供了与MATLAB相似的功能与操作方式,因为两者皆为解释型语言,并且都可以让用户在针对数组或矩阵运算时提供较标量运算更快的性能。两者相较之下,MATLAB提供了大量的扩展工具箱(例如Simulink);而NumPy则是根基于Python这个更现代、完整并且开放源代码的编程语言之上。此外NumPy也可以结合其它的Python扩展库。例如SciPy,这个库提供了更多与MATLAB相似的功能;以及Matplotlib,这是一个与MATLAB内置绘图功能类似的库。而从本质上来说,NumPy与MATLAB同样是利用BLAS与LAPACK来提供高效率的线性代数运算。

NumPy的核心功能是ndarray(即-dimensional array,多维数组)数据结构。这是一个表示多维度、同质并且固定大小的数组对象。而由一个与此数组相关系的资料类型对象来描述其数组元素的资料格式(例如其字符组顺序、在存储器中占用的字符组数量、整数或者浮点数等等)。

在数组中插入或追加元素并不像Python的list一样简单。np.pad(...)实际上创建了新的具有目标形状和填充值的数组,将给定数组的值复制到新数组中并返回新数组。np.concatenate()并没有直接连接两个数组,而是返回新的数组,该数组填充了两个原数组的值。用np.reshape(...)改变量组的维度只有在数组中元素数量不变的情况下才能实现。造成以上情况的原因是NumPy的数组必须占用连续的内存空间。Blaze包尝试克服这个限制。

未经矢量化的算法通常运行缓慢,因为它们必须用纯Python方法实现;由于需要创建和输入等大的临时数组,部分操作的矢量化可能会增长其空间复杂度(例如由常数增长到线性)。部分小组通过运行时编译(Runtime compilation of numerical code)避免这一问题。可与NumPy集成的开源解决方案包括 numexpr和Numba。Cython和Pythran是静态编译的解决方案。

许多现代大型科学计算应用的要求超出了NumPy数组的能能力。例如,NumPu数组通常加载到计算机的内存中,然而内存可能没有足够的容量;此外,NumPy仅在单个CPU上进行操作,而许多线性代数算子可以通过CPU的集群和其它特殊硬件(例如GPU、TPU,部分深度学习应用也依赖于这些特殊硬件)来加速。因此,近期在Python的生态中出现了许多其它工具,例如用于分布式数组的Dask(英语:Dask)、用于GPU计算的TensorFlow和JAX等。这些库通常实现或模仿NumPy的部分API,因此用户不需大量改动就可以部署原先使用NumPy的程序。近期出现的由Nuidia的CUDA架构加速的CuPy(英语:CuPy)库展示了快速计算的潜力,是NumPy的直接替代品。

相关

  • 上皮细胞上皮组织,简称上皮(英语:Epithelium),包括被覆上皮、腺上皮和感觉上皮三类。被覆上皮是被覆于各结构界面处的上皮组织,由规则密集排列的上皮细胞和少量细胞间质组成。在胚胎的发育
  • 四邑方言四邑方言或称冈州方言,即粤语支四邑片或称冈州片,主要分布于广东省江门市蓬江区、江海区、新会区、台山市、开平市、恩平市、鹤山市、珠海市斗门区、金湾区、中山市古镇镇以及
  • 艾瑞克·威斯乔斯艾瑞克·威斯乔斯,(Eric F. Wieschaus,1947年6月8日-),美国发育生物学家,1995年获得诺贝尔生理学或医学奖。出生于印第安纳南本德,圣母大学本科毕业,耶鲁大学博士。1978年开始在欧洲
  • 弗吉尼亚州州旗弗吉尼亚州州旗以蓝色为底,中央为弗吉尼亚州州徽。在州徽下方写有格言“Sic semper tyrannis”(拉丁语:这就是暴君的下场),这句话为古罗马布鲁图参与刺杀凯撒时所说。州徽中站立
  • 美国的色情作品美国的色情作品(英语:Pornography in the United States)在其建国之初便已存在,并在当下变得更加容易获得。从1969年由安迪·沃荷执导的《蓝色电影(英语:Blue Movie)》开始;到1969年
  • C++BuilderC++Builder 是一个用于在Windows平台上撰写C++语言应用程序的快速化程序开发(RAD,Rapid Application Development)的集成开发环境(IDE,Integrated Development Environment),原系由
  • 宋白宋白(936年-1012年),字太素,一作素臣,大名(今属河北)人,也有记载为开封人。有《宋文安公宫词》百首传世。十三岁能属文,早年在张琼家中教书。宋太祖建隆二年(961年)进士。乾德元年(963年),授著作佐郎。乾德三年(965年),授玉津县令。知蒲城、卫南二县。历任左拾遗,拜中书舍人。曾主持贡举,收受贿赂,又怕群议沸腾,于是先向皇上报告举人名单,宋太祖骂他“吾委汝知举,取舍汝当自决,何为白我?”太平兴国五年(980年),主持贡举。太平兴国八年(983年),主持贡举,改集贤殿直学士。后召为翰林学士。至道
  • 圣洛伦佐河 (墨西哥)圣洛伦佐河西班牙语:Río San Lorenzo)是墨西哥的一条河流,注入太平洋。
  • 太阳系流体静力平衡天体列表2006年,国际天文联合会对行星做出定义,规定行星即为按轨道围绕恒星运动、尺寸大到足以保持流体静力平衡并且清除邻近的小天体的天体。流体静力平衡天体在尺寸上足以令其引力克服内部刚性,并因此成为圆形(椭球形)。“清除邻近小天体”的实际意义是指卫星大到其引力足以控制附近的所有物体。根据国际天文联会此一定义,太阳系共有8颗行星。所有以轨道围绕太阳运行并保持流体静力平衡,但未能清除附近小天体的天体称为矮行星。除太阳、行星和矮行星外,太阳系内的所有其它天体则称为太阳系小天体。此外,太阳和另外十余颗卫星尺寸也大到足以达
  • 为自由而战的呐喊《为自由而战的呐喊:内战时代》(英语:Battle Cry of Freedom: The Civil War Era)是有关美国内战的普利策历史奖获奖作品,詹姆斯·M·麦克弗森著,1988年出版。是《牛津美国史》系列的第六卷。该书的节略插图版于2003年出版。它在《纽约时报》精装畅销书榜上占据了16周,在平装书榜上又占据了12周。Template:普利策历史奖