本文是一个Python强大的计算库,NumPy(以下简称np)的入门介绍。在本文中,你会了解到:
- 什么是numpy?
- 为什么要用numpy?
- 从python内置list到numpy,有什么不同?
- 怎么安装与学习numpy?
因为网上numpy基础教程非常多,而且基本都覆盖了核心内容。因此,我不会再重复介绍numpy的一些基本操作,我只会留一些链接在第四部分。相反,我会从一些high-level的角度,介绍numpy,给读者构建一个大体印象。
1. 什么是numpy?
根据numpy官网( https://numpy.org/doc/stable/user/whatisnumpy.html )的介绍,numpy是一个python的科学计算库(如其名,numpy=numeric python)。他提供了多维数组等实用对象,和大量对数组的快速操作与算法。
NumPy is the fundamental package for scientific computing in Python. It is a Python library that provides a multidimensional array object, various derived objects (such as masked arrays and matrices), and an assortment of routines for fast operations on arrays.
2. 为什么要用numpy?
2.1 方便
python的内置list仅提供了一些简单操作,如append增加元素,sort排序元素等。如果要做一些复杂运算,就会略显吃力。numpy集成了大量的数学、数组操作函数,不需要自己造轮子了。例如直接使用np.corr()
就可以计算相关系数,直接使用np.linalg.inv()
就可以计算矩阵的逆矩阵,直接调用np.fft
模块可以进行一些傅立叶变换相关的操作。
2.2 快速高效
高效是numpy的核心亮点之一。我想可以分为程序运行高效和程序员编程高效。
运行高效:因为python是一种解释型语言,其运行速度比c/c++语言会慢几十倍左右。numpy的底层代码(见 https://github.com/numpy/numpy )都是使用c语言写的,并被高度优化过。因此其相同任务运行速度远快于python的list,和c++水平大抵相同。举个例子,两个2,000,000长的向量相加,纯用python list和for循环需要0.173s,而使用numpy则只需要0.008s。
编程高效:numpy里的许多运算符也被重载过,进行一般四则运算也很方便。如两个np.ndarray
a, b, 可以直接通过加号a+b
实现向量的逐位相加,而若是两个list a,b, a+b
只是将两个列表拼接起来。另外,numpy也实现了-
, *
, &
进行逐位相减、逐位向乘、逐位与的操作。下面是例子展示。
1 | # a, b are list |
2.3 Python数据科学之基础
许多python的科学计算、数据科学库都是以numpy为数据容器的基础根基的。例如sklearn(机器学习库)中的算法使用numpy来实现,用户传入的均为numpy.ndarray
数据;matplotlib(画图库)中接收numpy.ndarray
数组绘图,等等。因此numpy是要用python玩数据科学等领域的基础。学会numpy,可以做以下事情:
复现论文中的算法
研究一些数据科学库的源码,实现细节
掌握一个以python为接口的高性能计算的核心工具,做任何想做的事情
……
3. 从python list到numpy
从python的内置list列表到numpy的ndarray有一些“同”也有一些“不同”。这里简单进行一个介绍,以使读者可以对numpy数组有一个更清晰的大体影响。
numpy.ndarray
对象更像是其他编程语言(如C++/Java)里的数组(这样的数组结构才可以做到快速操作)。一旦构建,就要声明数组大小形状和数据类型。例如在C++中声明一个二维10*10的整型数组可以是:
1 | int array[10][10]; |
而与之对应,在numpy里声明这样一个数组是:
1 | array = np.ndarray(shape=(10, 10), dtype=int) |
而python中的list实现本质是一个动态数组,其长度会根据运行时来决定。
接下来,我便由此列几点numpy数组和list的不同:
- 改变大小。
因为list是动态数组,其长度会根据运行时来决定,因此list有append、pop等方法改变列表长短。而numpy.ndarray
数组则“一旦构建,就有固定的大小”。在运行时不能改变大小(有几个元素),只能改变形状(如每行每列有几个元素)。np.append()
方法虽说叫append,但是其本质也是要构建一个新的数组,而不是在原来的上做添加。
- 统一数据类型。
一个python list中可以存放不同类型,例如[1, 1.2f, 'str']
。
一个numpy数组具有统一的数据类型,这使得其indexing索引、存储效率远高于list。一个数组内只能是一个类型,例如np.int32
, int
, np.float32
, float
等。如果需要存储不同类型,则需要将类型设为object
。但是这样许多numpy函数便不支持使用了。
但是作为python语言的模块,numpy的设计还是非常清晰易懂的。大体上就是创建数组对象,然后对其进行运算或函数操作。语法上也非常相近。例如,numpy也支持list的切片索引(如a[::2]
,且其功能玩法更多)。
4. 怎么安装与学习numpy?
4.1 安装
网上的教程非常多,涵盖Windows,macOS和Linux系统。只需在网上找到相关教程即可。使用anaconda、miniconda、pip安装都可以。
4.2 学习
以个人经验来看,numpy的学习胜在多用。只要用得多,自然而然就熟练、学会了。numpy已经包含了大部分需要用的函数,如有对应需求,一定要先去网上搜索看看有无相关函数(现在还有chatGPT之类的可以问了)。
对于新手朋友我在这里推荐几个学习资源链接:
NumPy官网 官方文档 https://numpy.org/doc/stable/index.html
【一个10分钟的numpy入门教程】(十分推荐) https://www.bilibili.com/video/BV1Wy4y1h7ii/?share_source=copy_web&vd_source=0c067fd928325f3684e2a932b9539e44
NumPy 教程 菜鸟教程(文字+例子,较全面): https://www.runoob.com/numpy/numpy-tutorial.html
全网最全Numpy图解教程 知乎(有很多图,生动形象)https://zhuanlan.zhihu.com/p/528144539
百度 Google搜索 (以“numpy xxxxxx”提问,基本上都会有想要的回答的)