深入浅出Pandas:利用Python进行数据处理与分析
上QQ阅读APP看书,第一时间看更新

2.3 NumPy

NumPy是Python的一个高性能矩阵运算的科学计算库。它的主要用途是以数组的形式进行数据操作和数学运算,数据分析、机器学习大都是进行数学计算。Pandas依赖NumPy,在安装它时会自动安装NumPy。Pandas的数据结构和运算的底层工作都交由NumPy来完成。但是,我们不需要过多关注NumPy的功能,直接使用Pandas的功能就可以,也不需要从NumPy的基础开始学习,这部分内容可以跳过,在学习过程中有需要再来查看。

2.3.1 NumPy简介

NumPy(官网https://numpy.org)是Python的科学计算包,代表Numeric Python。NumPy是Python中科学计算的基本软件包。它是一个Python库,提供多维数组对象以及蒙版数组和矩阵等各种派生对象,用于对数组进行快速便捷的操作,包括数学、逻辑、形状处理、排序、选择、I/O、离散傅立叶变换、基本线性代数、基本统计运算、随机模拟等。可以说,NumPy是数据科学中必不可少的工具。

由于NumPy对数据进行向量化描述,没有任何显式的循环操作,所以执行速度更快,代码更加简洁优雅,出错率更低。NumPy提供了两个基本的对象。

  • ndarray:存储数据的多维数组。
  • ufunc:对数组进行处理的函数。

2.3.2 数据结构

NumPy的ndarray提供了一维到三维的数据结构,图2-2所示为同构数据多维容器,所有元素必须是相同类型。我们经常用到的是一维和二维数组。

049-1

图2-2 NumPy的数据结构图示

ndarray对数据向量化,利用隐式逐元素方式的广播机制进行算术运算、逻辑运算、位运算、函数调用等,可以快速、批量地处理数据。

2.3.3 创建数据

使用NumPy需要先导入,约定俗成地为它起别名np。使用np.array可传入一个元组或列表。如果是二维数据,可以是由列表组成的列表或由元组组成的列表等形式。

import numpy as np

np.array([1, 2, 3])
np.array((1, 2, 3)) # 同上
# array([1, 2, 3])

np.array(((1, 2),(1, 2)))
np.array(([1, 2],[1, 2])) # 同上
'''
array([[1, 2],
        [1, 2]])
'''

以下是一些常见的数据生成函数。

np.arange(10) # 10个,不包括10,步长为1
np.arange(3, 10, 0.1) # 从3到9,步长为0.1
# 从2.0到3.0,生成均匀的5个值,不包括终值3.0
np.linspace(2.0, 3.0, num=5, endpoint=False)
 # 返回一个6×4的随机数组,浮点型
np.random.randn(6, 4)
# 指定范围、指定形状的数组,整型
np.random.randint(3, 7, size=(2, 4))
# 创建值为0的数组
np.zeros(6) # 6个浮点0.
np.zeros((5, 6), dtype=int) # 5×6整型0
np.ones(4) # 同上
np.empty(4) # 同上
 # 创建一份和目标结构相同的0值数组
np.zeros_like(np.arange(6))
np.ones_like(np.arange(6)) # 同上
np.empty_like(np.arange(6)) # 同上

2.3.4 数据类型

由于Pandas中的数据类型部分继承了NumPy的数据类型,所以我们需要了解一下NumPy的常见类型。

np.int64 # 有符号64位整型
np.float32 # 标准双精度浮点类型
np.complex # 由128位的浮点数组成的复数类型
np.bool # bool类型(True或False)
np.object # Python中的object类型
np.string # 固定长度的string类型
np.unicode # 固定长度的unicode类型
np.NaN # np.float的子类型
np.nan

2.3.5 数组信息

以下是一些获取数组信息的常用方法。

n.shape() # 数组的形状,返回值是一个元组
n.shape = (4, 1) # 改变形状
a = n.reshape((2,2)) # 改变原数组的形状,创建一个新数组
n.dtype # 数据类型
n.ndim # 维度数
n.size # 元素数
np.typeDict # np的所有数据类型

2.3.6 统计计算

两个数组间的操作采用行列式的运算规则,示例如下。

np.array([10, 20, 30, 40])[:3] # 支持类似列表的切片
a = np.array([10, 20, 30, 40])
b = np.array([1, 2, 3, 4])
a+b # array([11, 22, 33, 44])(矩阵相加)
a-1 # array([9, 19, 29, 39])
4*np.sin(a)

# 以下是一些数学函数的例子,还支持非常多的数学函数
a.max() # 40
a.min() # 10
a.sum() # 100
a.std() # 11.180339887498949
a.all() # True
a.cumsum() # array([10, 30, 60, 100])
b.sum(axis=1) # 多维可以指定方向

2.3.7 小结

由于Pandas调试依赖NumPy库,我们需要了解基础的NumPy数据类型和操作。不过不用担心,Pandas已经帮助我们封装好了各种计算,可以等到遇到涉及NumPy底层功能的内容时,再来学习查询。