Numpy,是Numerical Python的简称,它是目前Python数值计算中最为重要的基础包。大多数计算包都提供了基于Numpy的科学函数功能,将Numpy的数组对象作为数据交换的通用语。Numpy中会出现以下内容:
- ndarray,一种高效多维数组,提供了基于数组的便捷算术操作以及灵活的广播功能。
- 对所有数据进行快速的矩阵计算,而无需编写循环程序。
- 对硬盘中数组数据进行读写的工具,并对内存映射文件进行操作。
- 线性代数、随机数生成以及傅里叶变换功能。
- 由于连接Numpy到C/C++/Fortran代码库进行封装,并为这些代码提供动态、易用的接口。
Numpy本身并不提供建模和科学函数,理解Numpy的数组以及基于数组的计算将帮助你更高效地使用基于数组的工具,比如pandas。在大多数的数据分析应用中,我们将关注以下内容:
- 在数据处理、清洗、构造子集、过滤、变换以及其他计算中进行快速的向量化计算。
- 常见的数组算法,比sort、unique以及set操作等。
- 高效的描述性统计和聚合/概述数据。
- 数据排列和相关数据操作,例如对异构数据进行merge和join。
- 使用数组表达式来表明条件逻辑,替代if-elif-else条件分支的循环。
- 分组数据的操作(聚合、变换以及函数式操作)。
虽然Numpy提供了数值数据操作的计算基础,但是在大多情况下还是Pandas作为统计、分析的基石,尤其是针对表格数据。Pandas提供了更多的针对特定场景的函数功能,例如时间序列操作等Numpy并不包含的功能。
Numpy之所以如此重要,其中一个原因就是它的设计对于含有大量数组的数据非常有效。除此之外还有以下原因:
- Numpy在内部将数据存储在连续的内存块上,这与其他的Python内建数据结构是不同的。Numpy的算法库是用C语言写的,所以在操作数据内存时,不需要任何类型检查或者其他管理操作。Numpy数组使用的内存量也小于其他Python内建序列。
- Numpy可以针对全量数组进行复杂计算而不需要写Python循环
假设一个Numpy数组包含100万个整数,还有一个同样数据内容的Python列表:
import numpy as np
my_arr = np.arange(1000000)
my_list = list(range(1000000))
现在我们同时对每个序列乘以2:
%time for _ in range(10):my_arr2 = my_arr * 2
Wall time: 45.4 ms
%time for _ in range(10):my_list2 = [x * 2 for x in my_list]
Wall time: 2.3 s
使用Numpy方法比Python方法要快10到100倍,并且使用的内存也更少。