无法播放?请 点击这里 跳转到Youtube
切换视频源:

什么是Numpy?

随着现在市场对数据岗位的需求越来越多,数据和人工智能领域中的工具也百花齐发。而其中Python生态最为活跃,因语言本身的简洁性和其丰富的社区环境,Python毫无争议地登上了最受欢迎的宝座,所以如今Python成了入门数据领域的基本功。

而在你学习各种各种机器学习算法框架(Tensorflow, Pytorch 等等)之前,有三大基本工具是必须要掌握的,那就是NumPy, Pandas和Matplotlib。NumPy最主要的用途是用来计算数组的,而 Pandas 是建立在 NumPy 之上,用来处理更多形式的数据类型(比如Dataframe和Series),Matplotlib则负责实现数据可视化。

那本系列就带大家掌握这三个工具中最基础的NumPy,帮助你随意玩转Array。

到底为什么使用NumPy呢?

为什么使用 NumPy?因为 NumPy 能帮助我们更灵活、更快速地处理数组(Array)计算啊。那为什么要处理数组计算呢?主要是因为现在机器学习的方法本质上都是在进行矩阵(Matrix)计算,而矩阵本质上就是多维数组。而大部分复杂数据的组成形态也是矩阵,所以学会Numpy还是很有必要的。

Python Array 和 Numpy Array 的区别

那大家就好奇了,那我为什么不可以使用 Python 自带的 List 来处理数组呢,主要是因为以下两点原因:

  1. 处理数组更快:NumPy和Pandas的底层逻辑是用C语言写的,C这种底层语言自然能更快更有效率地调用电脑资源。
  2. 处理数组更灵活:NumPy 库中提供更多处理 Array 的方式,比如合并分割数组、对数组进行统计计算等等。

总而言之,NumPy使用了更优秀的实现方式来处理数组,和Python自带的数据类型相比,NumPy能用更少的空间存储相同的数据量,并用更快的方式进行数组计算。

NumPy基本功能演示

为了更方便并直观地使用NumPy,我建议大家使用 Jupyter Notebook 运行 Python 代码,另外再推荐一个谷歌开发的工具 CoLab,能在游览器上直接运行 Python 代码,CoLab中自带了很多库,还能使用谷歌免费提供的GPU实现更快速的数组计算。

首先我们先导入 numpy:

import numpy as np

然后使用以下的代码创建 numpy 数组:

np_array = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])
print(np_array) # 打印出numpy数组
print(np_array.shape) # 打印每个维度上的数组量:(2, 4)

numpy中还有一些很便捷的方式,帮助我们创建出特定的数组,比如下面这段代码,就会创建出一个10行10列的数组,其中的数字都是数据类型为float的1.0:

np_array = np.ones((10, 10), dtype = np.float)
print(np_array)

numpy array 的形状还能被改变,可以简单理解为一个数组的行数和列数被改变,但是其中的数字不变:

reshaped_np_array = np_array.reshape((2, 50))

Numpy vs Python List

看来用 NumPy 创建数组还挺方便的,那么 NumPy 在存储空间和计算效率上真的会碾压 Python List 吗,我们来运行下面的代码看一看:

import sys
python_list = range(1000)
print(f'Python list size: {sys.getsizeof(python_list) * len(python_list)}') # 48000
np_array = np.arange(1000)
print(f'Numpy Array size: {np_array.size * np_array.itemsize}') # 8000

可以看到 Python List 用了整整6倍的空间,存储和 numpy 数组相同的内容。

那我们再比较一下计算效率好了:

import time
array_size = 100000
python_list1 = range(array_size)
python_list2 = range(array_size)

start_time = time.time()
python_multiplication = [(n1 * n2) for n1, n2 in zip(python_list1, python_list2)]
print(f'Python multiplication time used: {time.time() - start_time}') # 0.012480020523071289

np_array1 = np.arange(array_size)
np_array2 = np.arange(array_size)

start_time = time.time()
numpy_multiplication = np_array1 * np_array2
print(f'Numpy multiplication time used: {time.time() - start_time}') # 0.0008220672607421875

计算就更夸张了,同样是实现数组之间的相乘,Python List 所用的时间至少是 Numpy 的上百倍。可见 Numpy 真的是在空间和时间上完爆 Python 自带的 List。

numpy array 还自带一些统计函数,帮助我们很方便地从数组中获得有用的统计数据:

np_array = np.arange(1, 21).reshape((4, 5))
print(np.argmin(np_array)) # 0
print(np.argmax(np_array)) # 19
print(np.mean(np_array)) # 10.5
print(np.median(np_array)) # 10.5

除了这些方便的数学函数,我们还可以很方便地将 numpy 存储在文件中,也很容易使用 numpy 从文件中读取数组:

from numpy import savetxt
np_array = np.array([1, 2, 3, 4, 5])
savetxt('data.csv', np_array, delimiter=',')
print(np_array)

from numpy import loadtxt
data = loadtxt('data.csv', delimiter=',')
print(data.astype(np.int))

NumPy课程大纲

上面演示的NumPy功能只是冰山一角,NumPy支持的功能非常丰富,如果只看官方文档肯定会让你头昏脑涨。但其实 NumPy 常用的功能是能在短时间内掌握的,那些不常用的奇技淫巧只需要在用到时候查查文档即可。为了帮助大家在短时间内掌握NumPy最核心的常用功能,我会在【NumPy入门教程】系列涵盖但不限于以下内容:

  1. Numpy Array 创建
  2. Array Indexing 索引
  3. Array Math 数学
  4. 高级操作(Broadcasting, Transposing)
  5. 合并和分割 Numpy Array

希望在完成这个教程后,大家能自信地操起NumPy对数组一顿操作猛如虎。

这个系列的课件会存在这里,如需要下载请参阅课件下载指南