数据结构论坛

首页 » 分类 » 分类 » 不懂NumPy算什么Python程序员C
TUhjnbcbe - 2025/7/27 15:46:00
北京那里看白癜风好 http://pf.39.net/bdfyy/bjzkbdfyy/

作者

天元浪子

责编

郭芮

出品

CSDN博客

大约七八年前,我曾经用pyOpenGL画过地球磁层顶的三维模型,这段代码至今仍然还运行在某科研机构里。在那之前,我一直觉得自己是一个合(you)格(xiu)的Python程序员,似乎无所不能。但磁层顶模型的显示效果令我沮丧——尽管这个模型只有十几万个顶点,拖拽、缩放却非常卡顿。

最终,我把顶点数量删减到两万左右,以兼顾模型质量和响应速度,才勉强交付了这个任务。从此我开始怀疑Python的性能,甚至一度怀疑Python是否还是我的首选工具。

幸运的是,后来我遇到了NumPy这个神器。NumPy是Python科学计算的基础软件包,提供多维数组对象,多种派生对象(掩码数组、矩阵等)以及用于快速操作数组的函数及API,它包括数学、逻辑、数组形状变换、排序、选择、I/O、离散傅立叶变换、基本线性代数、基本统计运算、随机模拟等等。

了解NumPy之后,我才想明白当初磁层顶的三维模型之所以慢,是因为使用了list(Python数组)而不是ndarray(NumPy数组)存储数据。有了NumPy,Python程序员才有可能写出媲美C语言运行速度的代码。熟悉NumPy,才能学会使用PyOpenGL/PyOpenCV/Pandas/Matplotlib等数据处理及可视化的模块。

事实上,NumPy的数据组织结构,尤其是数组(numpy.ndarray),几乎已经成为所有数据处理与可视化模块的标准数据结构了(这一点,类似于在机器学习领域Python几乎已经成为首选工具语言)。越来越多的基于Python的科学和数学软件包使用NumPy数组,虽然这些工具通常都支持Python的原生数组作为参数,但它们在处理之前会还是会将输入的数组转换为NumPy的数组,而且也通常输出为NumPy数组。在Python的圈子里,NumPy的重要性和普遍性日趋增强。换句话说,为了高效地使用当今科学/数学基于Python的工具(大部分的科学计算工具),你只知道如何使用Python的原生数组类型是不够的,还需要知道如何使用numpy数组。

在这个AI和ML霸屏的时代,如果不懂NumPy,请别说自己是Python程序员。

listVSndarray

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

numpy数组一旦创建,其元素数量就不能再改变了。增删ndarray元素的操作,意味着创建一个新数组并删除原来的数组。python数组的元素则可以动态增减。numpy数组中的元素都需要具有相同的数据类型,因此在内存中的大小相同。python数组则无此要求。numpy数组的方法涵盖了大量数学运算和复杂操作,许多方法在最外层的numpy命名空间中都有对应的映射函数。和python数组相比,numpy数组的方法功能更强大,执行效率更高,代码更简洁。然而,以上的差异并没有真正体现出ndarray的优势之所在,ndarray的精髓在于numpy的两大特征:矢量化(vectorization)和广播(broadcast)。矢量化可以理解为代码中没有显式的循环、索引等,广播可以理解为隐式地对每个元素实施操作。矢量化和广播理解起来有点抽象,我们还是举个栗子来说明一下吧。

例题:a和b是等长的两个整数数组,求a和b对应元素之积组成的数组。

1、用python数组实现:

c=list()foriinrange(len(a)):c.append(a*b)

2、用numpy数组实现:

c=a*b

这个栗子是不是体现了矢量化和广播的强大力量呢?请仔细体会!

总结:

矢量化代码更简洁,更易于阅读;更少的代码行通常意味着更少的错误;代码更接近于标准的数学符号;矢量化代码更pythonic。

dtypeANDshape

子曰:找对象先了解品行,学对象先了解属性。ndarray对象有很多属性,详见下表。

基于以下三个原因,我认为,dtype和shape是ndarray最重要的两个属性,重要到几乎可以忽略其他的属性。

我们趟过的坑,几乎都是dtype挖的;我们的迷茫,几乎都是因为shape和我们期望的不一样;我们的工作,很多都是在改变shape。ndarray.astype()可以修改元素类型,ndarray.reshape()可以重新定义数组的结构,这两个方法的重要性和其对应的属性一样。记住这两个属性和对应的两个方法,就算是登堂入室了。想了解numpy支持的元素类型,

1