Python中NumPy,SciPy,Pandas这些库的区别?
AI入门学习
共 3013字,需浏览 7分钟
·
2021-06-13 16:16
NumPy发展史:NumPy的历史可以追溯到90年代中期,它的前身为Numeric(用C语言编写,主要用来调取C++中应用)和Numarray(用于处理高维数组,可灵活的索引、数据类型变换、广播等),2005年出现的NumPy作为继承者,吸取了Numeric中丰富的C API及Numarray的高维数组处理能力,成为Python科学计算生态系统的基础。
NumPy的部分功能如下:
摘自《Python for Data Analysis》
ndarray,一个具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组。 用于对整组数据进行快速运算的标准数学函数(无需编写循环)。 用于读写磁盘数据的工具以及用于操作内存映射文件的工具。 线性代数、随机数生成以及傅里叶变换功能。 用于集成由C、C++、Fortran等语言编写的代码的A C API。 由于NumPy提供了一个简单易用的C API,因此很容易将数据传递给由低级语言编写的外部库,外部库也能以NumPy数组的形式将数据返回给Python。这个功能使Python成为一种包装C/C++/Fortran历史代码库的选择,并使被包装库拥有一个动态的、易用的接口。
NumPy本身并没有提供多么高级的数据分析功能,理解NumPy数组以及面向数组的计算将有助于你更加高效地使用依赖NumPy的Python科学计算库,如Biopython、SciPy、statsmodels、scikit-learn、Pandas等等。
NumPy之于数值计算特别重要的原因之一,是因为它可以高效处理大数组的数据, 这是因为:
摘自《Python for Data Analysis》
NumPy是在一个连续的内存块中存储数据,独立于其他Python内置对象。 NumPy的C语言编写的算法库可以操作内存,而不必进行类型检查或其它前期 工作。比起Python的内置序列,NumPy数组使用的内存更少。 NumPy可以在整个数组上执行复杂的计算,而不需要Python的for循环。
实例证实NumPy的高效:
以下来自文献
2、NumPy数组ndarray
a, The NumPy array data structure and its associated metadata fields. -数组结构:数据、数据类型、维度、内存中向前移动的字节数 b, Indexing an array with slices and steps. These operations return a ‘view’ of the original data. -数组索引 c, Indexing an array with masks, scalar coordinates or other arrays, so that it returns a ‘copy’ of the original data. In the bottom example, an array is indexed with other arrays; this broadcasts the indexing arguments before performing the lookup. 使用其他数组索引数组 d, Vectorization efficiently applies operations to groups of elements.-数组矢量化 e, Broadcasting in the multiplication of two-dimensional arrays. -数组广播 f, Reduction operations act along one or more axes. In this example, an array is summed along select axes to produce a vector, or along two axes consecutively to produce a scalar. -数组按行按列运算 g, Example NumPy code, illustrating some of these concepts. -以上概念的example
3、哪些Python科学计算生态系统依赖NumPy?
下图非常清晰,NumPy在生物学(Biopython)、物理、化学、天文学、地球科学、心理学、材料科学、工程学、金融和经济学等领域的研究分析中都起着至关重要的作用。
4、深度学习和人工智能时代NumPy如何突围?
NumPy 在 CPU 上性能超级nice,接近编译语言【如像C/C++等】; 但是,随着深度学习和人工智能的出现,加速需求催生了专用加速器硬件【如 GPU、TPU 和 FPGA】,由于 NumPy 具有的内存内数据模型,它无法直接使用这类存储和专用硬件。 NumPy社区为了应对挑战,开发出了NumPy array protocols,包含诸多函数【如 Dask、CuPy、PyData/Sparse等】以协调外部数组对象对NumPy的调用。
5、NumPy的下一个十年
新的设备将被开发出来,现有的专用硬件也不断发展,NumPy如何兼容? 科学数据规模将继续扩大; 新一代语言,如Rust、Julia和LLVM、解释器和编译器,将创造新的概念和数据结构。
参考资料
https://www.nature.com/articles/s41586-020-2649-2
Harris CR, Millman KJ, van der Walt SJ, et al. Array programming with NumPy. Nature. 2020;585(7825):357-362. doi:10.1038/s41586-020-2649-2
评论