0%

Numpy快速入门总览

本文是一个Python强大的计算库,NumPy(以下简称np)的入门介绍。在本文中,你会了解到:

  1. 什么是numpy?
  2. 为什么要用numpy?
  3. 从python内置list到numpy,有什么不同?
  4. 怎么安装与学习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
2
3
4
5
6
7
8
9
10
11
# a, b are list
a = [1, 2, 3]
b = [3, 2, 1]
a+b
#OUTPUT: [1, 2, 3, 3, 2, 1]

# a, b are ndarray
a = np.array([1, 2, 3])
b = np.array([3, 2, 1])
a+b
#OUTPUT: np.array([4, 4, 4])

2.3 Python数据科学之基础

许多python的科学计算、数据科学库都是以numpy为数据容器的基础根基的。例如sklearn(机器学习库)中的算法使用numpy来实现,用户传入的均为numpy.ndarray数据;matplotlib(画图库)中接收numpy.ndarray数组绘图,等等。因此numpy是要用python玩数据科学等领域的基础。学会numpy,可以做以下事情:

  1. 复现论文中的算法

  2. 研究一些数据科学库的源码,实现细节

  3. 掌握一个以python为接口的高性能计算的核心工具,做任何想做的事情

  4. ……

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之类的可以问了)。

对于新手朋友我在这里推荐几个学习资源链接: