NumPy库(Numerical Python)是Python科学计算环境中最常用的库。它提供了用于处理数组的高效数据结构。Numpy库的核心是使用C语言实现的。
参考资料
NumPy官方网站
在线练习环境
Numpy菜鸟教程
# 为了使用NumPy库,需要先导入它。按照惯例,我们以别名np导入numpy模块。
import numpy as np
NumPy库的核心是表示同质数据的多维数组。数组内所有元素的数据类型是相同的。NumPy中多维数组的主要数据结构是ndarray类(class)。除了保存数组中的数据,这种数据结构还可以包含关于数据的重要描述性的元数据(metaData)。
data = np.array(([1,2],[3,4],[5,6]))
data
# 变量类型
print(type(data))
# 数组维度
data.ndim
# 数组形状
data.shape
# 数组元素数目
data.size
# 数组元素类型
data.dtype
dtype | 变体 | 说明 |
---|---|---|
int | int8, int16, int32, int64 | 整数 |
unit | unit8, unit16, unit32, unit64 | 无符号整数 |
bool | bool | 布尔类型 |
float | float16, float32, float64, float128 | 浮点类型 |
complex | complex64, complex128, complex256 | 复数浮点类型 |
# 默认数据类型
data = np.array([1,2,3])
print(data.dtype)
# 指定数据类型
data = np.array([1,2,3], dtype=float)
print(data.dtype)
# 使用 np.array 函数
data = np.array([1,2,3])
print(data.dtype)
data = np.array(data, dtype=float)
print(data.dtype)
# 使用ndarray类内置的astype方法
data = data.astype(np.int64)
print(data.dtype)
data = np.array([-1,0,1])
np.sqrt(data)
np.sqrt(data, dtype=complex)
# 复数的实部和虚部
print(np.sqrt(data, dtype=complex).real)
print(np.sqrt(data, dtype=complex).imag)
对于包含行列的二维数据:一种可能的方式是按顺序逐行存储数据;一种可能的方式是按列存储数据。前者为行主序(row-major),后者为列主序(column-major)。C语言使用行主序,Fortran和MATLAB使用列主序。
NumPy数组默认使用行主序,创建数组时可以使用关键词参数order='C'
或者order='F'
设置。当使用借助C或者Fortran编写的接口时,需要特别注意NumPy数组的排序方式。
函数名 | 说明 |
---|---|
np.zeros | 指定维度和类型,以0填充 |
np.ones | 指定维度和类型,以1填充 |
np.empty | 未初始化数组 |
np.arange | 创建均匀间隔数组,指定开始值、结束值和增量值 |
np.linpace | 创建均匀间隔数组,指定开始值、结束值和元素数量 |
np.random.rand | 创建一个数组,元素为0-1之间均匀分布的随机数 |
np.zeros_like | 复制一个数组的维度和类型,以0填充 |
np.zeros((2,3)) # 默认浮点型
np.ones((2,3)) # 默认浮点型
np.empty((2,3)) # 未赋值使用将导致未知错误
# np.arange 不包括结束值
np.arange(0,5,1)
# np.linspace 包括结束值
np.linspace(0,5,5)
可以使用函数np.meshgrid
生成多维坐标网络。
x = np.array([-1, 0, 1])
y = np.array([-2, 0, 2])
X, Y = np.meshgrid(x, y)
print(X)
print(Y)
二维坐标数组的常见应用场景是计算包含两个变量x和y的函数,可以用于绘制包含这两个变量的函数图形,如等高线图。
Z = (X + Y) ** 2
print(Z)
np.fromfunction
函数读入多维坐标数组,返回运算结果。
def func(i, j):
return (i+1)*(j+1)
np.fromfunction(func, (9, 9)) # 99乘法表
正整数用于从数组开头进行索引(索引开始于0),负整数用于从数组结尾进行索引(索引开始于-1)。
函数名 | 说明 |
---|---|
a[m] | 选择索引m处的元素,m为整数(从0开始计数) |
a[-m] | 从数组末尾选择第m个元素,m为负整数(索引开始于-1) |
a[m:n] | 选择索引为m到n-1的元素 |
a[:] | 指定维的所有元素,等价为a[0:-1] |
a[m:n:p] | 选择索引为m到n(不含)的间隔为p的元素 |
a[::-1] | 逆序选择所有元素 |
a = np.arange(0, 11)
print(a)
print(a[5:])
print(a[::-2])
f = lambda m, n: n + 5 * m
a = np.fromfunction(f, (5,5))
print(a)
print(a[1, 1])
print(a[1, :]) # 第二行
print(a[:, 1]) # 第二列
为了提高性能,使用切片操作提取的子数组是内存中同一组数据的不同视图。如果更改视图中的数据,原始数组中的数据也会被修改。如果需要数据的副本,可以使用np.copy()
函数。
b = a[::2, ::2]
print(b)
b[:, :] = 0
print(a)
A = np.arange(10)
B = A > 5
print(B)
A[B]= -1
print(A)
函数名 | 说明 |
---|---|
np.reshape 和 np.ndarray.reshape | 调整N维数组的维度。元素的总数保持不变。 |
np.resize 和 np.ndarray.resize | 调整N维数组的大小,创建新副本。元素增加则使用原数据填充。 |
np.ndarray.flatten | 创建N维数组的副本,并折叠成一维数组 |
np.ndarray.ravel | 创建N维数组的视图,并折叠成一维数组 |
np.squeeze | 删除长度为1的维度 |
np.expand_dims 和 np.newaxis | 在数组中增加长度为1的新维度 |
np.transpose 和 np.ndarray.transpose | 对数组进行转置 |
np.hstack 和 np.hstack | 对数组进行转水平叠加(沿着轴1)和垂直叠加(沿着轴0) |
np.append | 在数组中添加元素。该操作会创建一个副本 |
np.insert 和 np.delete | 在数组中插入和删除元素。该操作会创建一个副本 |
对标量和数组进行操作,广播会对标量与数组中的每个元素分别进行运算。当两个数组大小不同时,较小的数组通过广播匹配较大的数组。
对不兼容大小或形状的数组进行算数运算,则会引发ValueError错误。
布尔数组和数值数组一起出现时,布尔数组会被转换为数值数组,False和True分别被转换为0和1。
对数组进行聚合计算,返回一个标量。
函数名 | 说明 |
---|---|
np.where | 根据条件数组的值从连个数组中选择值 |
np.choose | 根据给定的索引数组选择 |
np.select | 根据条件列表从数组中选择 |
np.nonzero | 返回非0值的索引 |
函数名 | 说明 |
---|---|
np.transpose 和 dp.ndarray.T | 转置 |
np.fliplr 和 npflipud | 反转每行和每列的元素 |
np.rot90 | 沿着前两个轴把元素旋转90度 |
np.sort 和 np.ndarray.sort | 沿着指定轴对元素进行排序 |
函数名 | 说明 |
---|---|
np.dot | 点积 |
np.inner | 内积 |
np.cross | 叉积 |
np.tensordot | 沿着多维数组指定轴进行点积 |
np.outer | 外积(向量张量积) |
np.kron | 两个高维数组进行Kronecker积(矩阵张量积) |
np.einsum | 对多维数组执行爱因斯坦求和约定操作 |
NumPy为ndarray提供另一种数据结构matrix,诸如A * B
之类的表达式可以使用matrix乘法表示。逆矩阵表示为 matrix.I
,复共轭转置表示为 matrix.H
。与np.matrix
创建数据副本不同,np.asmatrix
函数以np.matrix
实例的形式创建原始数组的视图,不增加计算成本。
最后给大家准备一份小册子
参考文献来自桑鸿乾老师的课件:科学计算和人工智能