NumPy基础
NumPy 介绍
NumPy 是 Python 科学计算中非常重要的一个库,它提供了快速、高效的多维数组对象及其操作方法,是众多其他科学计算库的基础。
NumPy 最重要的功能之一是提供了高效的多维数组对象 ndarray,可以用来表示向量、矩阵和更高维的数组。它是 Python 中最重要的科学计算数据结构,支持广泛的数值运算和数学函数操作。
- NumPy 提供了多种数组操作方法,包括数组索引、切片、迭代、转置、变形、合并等,以及广播 (broadcasting) 机制,使得数组操作更加方便、高效。这些话题是本书后续要展开讲解的内容。后文会专门讲解广播。
- NumPy 提供了丰富的数学函数库,包括三角函数、指数函数、对数函数、逻辑函数、统计函数、随机函数等,能够满足大多数科学计算需要。
- NumPy 支持多种文件格式的读写操作,包括文本文件、二进制文件、CSV 文件等。NumPy 基于 C 语言实现,因此可以利用底层硬件优化计算速度,同时还支持多线程、并行计算和向量化操作,使得计算更加高效。
- NumPy 提供了丰富的线性代数操作方法,包括矩阵乘法、求逆矩阵、特征值分解、奇异值分 解等,可以方便地解决线性代数问题。
- NumPy 可以于 Matplotlib 库集成使用,方便地生成各种图表,如线图、散点图、柱状图等。前面的内容已经介绍了基于 NumPy 数据绘制的平面、三维图像。
- NumPy 提供了一些常用的数据处理方法,如排序、去重、聚合、统计等,方便对数据进行预处理。即便如此,“鸢尾花书”中我们更常用 Pandas 处理数据,本书后续将专门介绍 Pandas。
手动构造数组
我们可以利用 numpy.array() 手动生成一维、二维、三维等数组。下面首先介绍如何使用 numpy.array() 这个函数。
numpy.array(object, dtype)
函数
参数说明
object 转换为数组的输入数据,可以是列表、元组、其他数组或类似序列的对象。
dtype 参数用于指定数组的数据类型。如果不指定 dtype 参数,则 NumPy 会自动推断数组的数据类型。
使用例
import numpy as np # 从列表中创建一维数组 arr1 = np.array([1, 2, 3, 4]) # 指定数组的数据类型 arr2 = np.array([1, 2, 3, 4], dtype=float) # 从元组中创建二维数组 arr3 = np.array([(1, 2, 3), (4, 5, 6)]) # 指定最小维度 arr4 = np.array([1, 2, 3, 4], ndmin=2)
提示
除了使用
numpy.array()
外也可以使用numpy.zeros()
函数或numpy.ones()
函数创建指定大 小的全 0 或全 1 数组,还可以使用numpy.random
模块生成随机数组等。
数组特征
在 NumPy 中,数组又称为 ndarray,它具有形状、长度、维度、大小四个特征:
- 形状:可以使用 shape 属性来获取数组的形状,即每个维度上的大小,例如,如果数组 arr 是一个二维数组,则可以使用
arr.shape
来获取其形状。 - 长度:可以使用
len()
函数来获取数组的长度,例如,如果数组 arr 是一个一维数组,则可以使用len(arr)
来获取其长度。 - 维数:可以使用 ndim 属性来获取数组的维数,例如,如果数组 arr 是一个二维数组,则可以使用
arr.ndim
来获取其维数。 - 大小:可以使用 size 属性来获取数组的大小,即所有元素的个数,例如,如果数组 arr 是一个二维数组,则可以使用
arr.size
来获取其大小。
生成数列
在 NumPy 中我们常用以下三个函数生成数列:
numpy.arange(start, stop, step)
。生成等差数列,从起始值 start 开始,以步长 step 递增,直到结束值 stop (不包含 stop)。例如,numpy.arange(1, 11, 2)
将生成一个等差数列 [1, 3, 5, 7, 9]。实际上,numpy.arange()
和前文介绍的range()
函数颇为相似。numpy.linspace(start, stop, num, endpoint)
。生成等间距数列,从起始值 start 开始,到结束值 stop 结束,num 指定数列的长度 (元素的个数),默认为 50。endpoint 参数指定是否包含结束值。例如,numpy.linspace(1, 10, 6)
生成一个等间距数列 [1, 3.25, 5.5, 7.75, 10]。numpy.logspace(start, stop, num, endpoint, base)
:生成等比数列,从 base 的 start 次幂开始,到 base 的 stop 次幂结束,num 指定数列的长度,默认为 50。endpoint 和 dtype 参数与numpy.linspace()
函数相同。例如,numpy.logspace(0, 4, 5, base=2)
将生成一个等比数列 [1, 2, 4, 8, 16]。
生成网格数据
numpy.meshgrid()
函数。numpy.meshgrid()
可以生成多维网格数据,它可以将多个一维数组组合成一个 N 维数组,并且可以方便地对这个 N 维数组进行计算和可视化。
在科学计算中,常常需要对多维数据进行可视化,比如绘制 3D 曲面图、等高线图等。 numpy.meshgrid()
可以方便地生成网格数据,使得我们可以对多维数据进行可视化。
特殊数组
下表总结了 NumPy 中常用来生成特殊数组的函数、用途和示例。
函数 | 用途 | 代码示例 |
---|---|---|
numpy.empty() | numpy.empty() 是一个用于创建一个指定大小的、未初始化的数组的函数。它返回一个数组对象,其元素的值是随机的,取决于数组在内存中的位置。因此,使用 numpy.empty() 创建的数组的值是不确定的。 | np.empty([4,4]) |
numpy.empty_like() | numpy.empty_like() 是一个用于创建与给定数组具有相同形状和数据类型的未初始化数组的函数。它返回一个新的数组对象,其元素的值是随机的,取决于数组在内存中的位置。因此,使用 numpy.empty_like() 创建的数组的值是不确定的。 | np.empty_like(A) # A 是二维列表 |
numpy.eye() | numpy.eye() 是一个用于创建一个二维数组,表示单位矩阵的函数。它返回一个 的矩阵,其中对角线上的元素为1,其他元素为0。可以通过指定参数 N,来指定矩阵的大小。 | np.eye(5) |
numpy.full() | numpy.full() 是一个用于创建一个指定大小和给定值的数组的函数。它返回一个数组对象,其所有元素都初始化为指定的值。可以通过指定参数来指定数组的大小和数据类型,以及所填充的值。 | np.full((3,3), np.inf) |
numpy.full_like() | numpy.full_like() 是一个用于创建与给定数组具有相同形状和数据类型,且所有元素都是指定值的数组的函数。它返回一个新的数组对象,其所有元素都初始化为指定的值。可以通过指定参数来指定所填充的值。 | np.full_like(A, 100) # A 是二维列表 |
numpy.ones() | numpy.ones() 是一个用于创建一个指定大小的全 1 数组的函数。它返回一个数组对象,其所有元素都是 1。可以通过指定参数来指定数组的大小和数据类型。 | np.ones((5,5)) |
numpy.ones_like() | numpy.ones_like() 是一个用于创建与给定数组具有相同形状和数据类型,且所有元素都是 1 的数组的函数。它返回一个新的数组对象,其所有元素都是 1。可以通过指定参数来指定所创建数组的数据类型。 | np.ones_like(A) # A 是二维列表 |
numpy.zeros() | numpy.zeros() 是一个用于创建一个指定大小的全 0 数组的函数。它返回一个数组对象,其所有元素都是 0。可以通过指定参数来指定数组的大小和数据类型。 | np.zeros((5,5)) |
numpy.zeros_like() | numpy.zeros_like() 是一个用于创建与给定数组具有相同形状和数据类型,且所有元素都是 0 的数组的函数。它返回一个新的数组对象,其所有元素都是 0。可以通过指定参数来指定所创建数组的数据类型。 | np.zeros_like(A) # A 是二维列表 |
随机数
NumPy 中还有大量产生随机数的函数。下表总结了 NumPy 中和随机数有关的常用函数。
随机数服从的分布 | 函数 | 随机分布图像 |
---|---|---|
连续均匀分布 | numpy.random.uniform() | |
均匀分布 | numpy.random.randint() | |
Beat 分布 | numpy.random.beta() | |
泊松分布 | numpy.random.poisson() | xxxxxxxxxx import itertoolsstring = 'abc'# 定义元素列表elements = list(string)# 指定组合长度length = 2# 生成有放回组合combos = itertools.combinations_with_replacement(elements, length)# 遍历并打印所有组合res = []for combination_idx in combos: res.append(''.join(combination_idx))print(res)# ['aa', 'ab', 'ac', 'bb', 'bc', 'cc']python |
指数分布 | numpy.random.exponential() | |
几何分布 | numpy.random.geometric() | |
二项分布 | numpy.random.binomial() | |
正态分布 | numpy.random.normal() | |
多元正态分布 | numpy.random.multivariate_normal() | |
对数正态分布 | numpy.random.lognormal() | |
t 分布 | numpy.random.standard_t() | |
Dirichlet 分布 | numpy.random.dirichlet() |
数据导入、导出
numpy.savetxt()
可以把 numpy array 写成 txt、CSV 文件。numpy.genfromtxt()
可以用来读入 txt、CSV 文件。