首页 > 其他分享 >1.NumPy 介绍

1.NumPy 介绍

时间:2023-12-26 21:34:00浏览次数:48  
标签:原生 Numarray Python Numeric 介绍 数组 NumPy

1.NumPy 介绍

1.1 NumPy 演变史

在 NumPy 之前,有两个 Python 数组包:

  • Numeric 包

    Numeric 包开发于 20 世纪 90 年代中期,在 Python 中提供了数组对象和数组感知函数。它由 C 语言编写,并与线性代数的标准快速实现相链接。它最早的用途之一是引导 C++ 应用程序,用于劳伦斯利弗莫尔国家实验室(Lawrence Livermore National Laboratory)的惯性约束聚变研究。

  • Numarray 包

    为了处理来自哈勃太空望远镜的大型天文图像,Numeric 的重新实现(称为 Numarray)增加了对结构化数组、灵活索引、内存映射、字节序变体、更高效的内存使用、灵活的 IEEE 754 标准错误处理能力以及更好的类型转换规则的支持。尽管 Numarray 与 Numeric 高度兼容,但这两个软件包之间的差异足以导致社区分裂;

2005 年,NumPy 作为 "两全其美 "的统一出现了——将 Numarray 的功能与 Numeric 的小数组性能及其丰富的 C API 相结合。

15 年后的今天,NumPy 几乎支撑了所有进行科学或数值计算的 Python 库,包括 SciPy、Matplotlib、pandas、scikit-learn 和 scikit-image。NumPy 是一个社区开发的开源库,它提供了一个多维 Python 数组对象,以及可对其进行操作的数组感知函数。由于其固有的简单性,NumPy 数组是 Python 中数组数据事实上的交换格式。

NumPy 使用中央处理器(CPU)操作内存内数组(in-memory arrays)。为了利用现代的专用存储和硬件,Python 数组软件包最近大量涌现。与 Numarray-Numeric 之分不同的是,考虑到已经有大量工作建立在 NumPy 之上,这些新库现在更难分裂用户社区。不过,为了让社区能够使用新的探索性技术,NumPy 正在向一个中央协调机制过渡,该机制指定了一个定义明确的数组编程 API,并根据需要将其分派给专门的数组实现。

1.2 NumPy 核心

NumPy包的核心是 ndarray 对象。它封装了python原生的同数据类型的 n 维数组,但 NumPy数组 和 原生Python Array(数组)之间有几个重要的区别:

  • NumPy 数组在创建时具有固定的大小,与Python的原生数组对象(可以动态增长)不同。更改ndarray的大小将创建一个新数组并删除原来的数组。

  • NumPy 数组中的元素都需要具有相同的数据类型,因此在内存中的大小相同。 例外情况:Python 的原生数组里包含了 NumPy 的对象的时候,这种情况下就允许不同大小元素的数组。

  • NumPy 数组有助于对大量数据进行高级数学和其他类型的操作。通常,这些操作的执行效率更高,比使用Python原生数组的代码更少。

  • 越来越多的基于 Python 的科学和数学软件包使用 NumPy 数组; 虽然这些工具通常都支持 Python 的原生数组作为参数,但它们在处理之前会还是会将输入的数组转换为 NumPy 的数组,而且也通常输出为 NumPy 数组。换句话说,为了高效地使用当今科学/数学基于 Python 的工具(大部分的科学计算工具),你只知道如何使用 Python 的原生数组类型是不够的——还需要知道如何使用 NumPy 数组。

1.3 NumPy 为什么这么快?

例如矩阵运算中常见的逐元素相乘:

  • 若是使用 Python 的循环实现,则会付出Python中循环的效率低下的代价。

  • 而若是通过 C 的循环更快地完成相同的任务,则节省了解释 Python 代码和操作 Python 对象所涉及的所有开销,但牺牲了用 Python 编写代码所带来的好处。

因此我们的目标应该是以近 C 速度执行前面的示例所做的事情,但是我们期望基于 Python 的代码具有简单性。

NumPy 提供了两全其美的解决方案:当涉及到 ndarray 时,逐个元素的操作是“默认模式”,但逐个元素的操作由预编译的C代码快速执行。

NumPy 有两个特征,它们是 NumPy 的大部分功能的基础:

  • 矢量化:

    对整个数组而不是单个元素进行操作是数组编程的关键。这意味着在 C 语言中需要几十行才能表达的操作,往往可以用一个简单明了的 Python 表达式来实现。这使得代码更加简洁,用户可以专注于分析细节,而 NumPy 对数组元素的循环处理也接近最优,例如,将跨步考虑在内,以充分利用计算机的高速缓冲存储器。

    image

  • 广播:

    在两个形状相同的数组上执行矢量化操作(如加法)时很简单。通过 "广播",NumPy 允许维数不同,并产生符合直觉的结果。简单而言,依托广播机制可以实现直接向数组中添加一个标量值,但广播还能推广到更复杂的例子,例如缩放数组的每一列或生成坐标网格。在广播中,一个数组或两个数组实际上仅为虚拟复制(即不在内存中复制任何数据),这样操作数的形状就会匹配。当使用索引数组对数组进行索引时,也会应用广播。

    image

标签:原生,Numarray,Python,Numeric,介绍,数组,NumPy
From: https://www.cnblogs.com/AncilunKiang/p/17929405.html

相关文章

  • 云南师范大学考研调剂+导师介绍+研一攻略
    我是23年4月参加的调剂,调剂到了云南师范大学民族教育信息化实验室计算机应用技术专业,具体的过程可以看之前的博客,有记录当时的心理活动及过程,可谓是非常的煎熬(当然怪自己分数太低)。1.调剂调剂的公开流程我不做过多介绍,大家到别处找一点具体的调剂过程,我在这只说YNNU的调剂。我......
  • numpy、scipy、pandas、matplotlib的读书报告
    一、基本函数的用法numpynumpy是Python中用于进行科学计算的基础模块,它提供了高效的多维数组对象ndarray,以及相关的数学运算和线性代数函数。numpy的主要功能有:创建和操作多维数组,如使用np.array(),np.arange(),np.zeros(),np.ones(),np.reshape()等函数。对数组进行索引和切片,如......
  • Charles 功能介绍和使用教程
    Charles功能介绍和使用教程Android爱好者2018-08-27146,318阅读24分钟   Charles简介Charles是在PC端常用的网络封包截取工具,在做移动开发时,我们为了调试与服务器端的网络通讯协议,常常需要截取网络封包来分析。除了在做移动开发中调试端口外,Charles也可以用......
  • fastjson2 JSONWriter.Feature介绍
    JSONWriter.Feature介绍FieldBased基于字段反序列化,如果不配置,会默认基于public的field和getter方法序列化。配置后,会基于非static的field(包括private)做反序列化。IgnoreNoneSerializable序列化忽略非Serializable类型的字段BeanToArray 将对象序列为[101,“XX”]这样的数组格......
  • CH32V307 DHCP例程介绍
    1、DHCP概述DHCP,全称为DynamicHostConfigurationProtocol,动态主机配置协议,该协议允许服务器向客户端动态分配IP地址和配置信息,实现了自动设置IP地址、统一管理IP地址分配,简单理解为实现即插即用。 2、例程介绍main函数内容如下: /**********************************......
  • 【flink番外篇】6、flink的WaterMark(介绍、基本使用、kafka的水印以及超出最大允许延
    Flink系列文章一、Flink专栏Flink专栏系统介绍某一知识点,并辅以具体的示例进行说明。1、Flink部署系列本部分介绍Flink的部署、配置相关基础内容。2、Flink基础系列本部分介绍Flink的基础部分,比如术语、架构、编程模型、编程指南、基本的datastreamapi用法、四大基......
  • 【UVCAD】- 图块介绍,及与图层的区别
    【UVCAD】手机二维CAD建模,不止是看图,还提供了数十种工具用了创建和修改图形。UVCAD专注于二维(2D)的移动计算机辅助绘图(CAD)。UVCAD具有触摸优化的直观界面和工具。使用UVCAD,您可以在触摸屏上用手指或触控笔进行真正的2D绘图、2D建模和2D设计。对于需要易于使用的工具来在移动设备上更......
  • Java并发(二十一)----wait notify介绍
    1、小故事-为什么需要wait由于条件不满足(没烟干不了活啊,等小M把烟送过来),小南不能继续进行计算但小南如果一直占用着锁,其它人就得一直阻塞,效率太低于是老王单开了一间休息室(调用wait方法),让小南到休息室(WaitSet)等着去了,但这时锁释放开,其它人可以由老王随机安排进屋......
  • tomcat介绍
    tomcat是什么Tomcat是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP程序的首选。Tomcat技术先进、性能稳定,而且免费,因而深受Java爱好者的喜爱并得到了部分软件开发商的认可,成为比较流行的Web应用......
  • 一些好用的maven插件介绍
     一些好用的maven插件介绍转载自:https://juejin.cn/post/7231527422200692794Maven插件是扩展Maven功能的方式之一,它可以帮助我们更轻松地管理依赖性、构建应用程序、运行测试和部署应用程序等。maven插件实在是太多了,我这里也介绍不完,仅仅以我使用过的也比较实用的给大家......