NumPy文档:Overview — NumPy v1.21 Manual
NumPy中文参考手册:NumPy 参考手册 | NumPy 中文
NumPy教程:NumPy 数组属性 | 菜鸟教程
数组和矩阵的区别
数组中的元素可以是数字、字符等,矩阵只能是数字。
视图和副本
副本是数据的一份完整拷贝(深拷贝,deep copy)。如果对副本进行修改,由于内存地址不同,原数据不会受到影响。
视图是数据的一个别称或引用(浅拷贝,shallow copy)。如果对视图进行修改,由于内存地址相同,原数据会受到影响。
视图一般发生在:
- numpy 的切片操作返回原数据的视图
- 调用 ndarray 的 view() 函数产生一个视图
副本一般发生在:
- Python 序列的切片操作,调用deepCopy()函数
- 调用 ndarray 的 copy() 函数产生一个副本
一、数组属性
方法 | 描述 |
---|---|
ndarray.shape | 数组维度的元组 |
ndarray.ndim | 数组维度数量 |
ndarray.size | 数组元素总数 |
ndarray.dtype | 数组元素的数据类型 |
二、创建数组
方法 | 描述 |
---|---|
np.array(object, dtype) | 创建数组 |
np.asarray(object, dtype) | 将输入转换为数组。当object为数组时,np.array生成副本,np.asarray生成视图 |
np.ascontiguousarray(array_like, dtype) | 转换为内存连续的数组 |
np.zeros(shape, dtype) | 创建零数组 |
np.zeros_like(array_like, dtype) | 创建零数组 |
np.ones(shape, dtype) | 创建元素值全为1的数组 |
np.ones_like(array_like, dtype) | 创建元素值全为1的数组 |
np.eye(N) <=> np.identity(N) | 创建单位数组 |
np.arange(start=0, stop, step=1) | 在区间内生成有序数列,取值范围[start, stop) |
np.linspace(start, stop, num, endpoint) | 在区间内生成均匀间隔的点。start、stop是array_like的数据,默认endpoint=True。当endpoint=True时,间隔为(stop-start)/(num-1),生成的序列包含stop;当endpoint= False时,间隔为(stop-start)/(num),生成的序列不包含stop |
np.random.rand(*dn) <=> np.random.random(size) | 生成[0,1)区间内的浮点随机数数组 |
np.random.randn(*dn) | 生成标准正态分布的随机数数组 |
np.random.randint(low, high, size, dtype) | 生成指定范围内的随机整数数组 |
三、索引和切片
数组可以通过Python语法 a[obj] 进行索引,触发基本索引还是高级索引取决于obj的类型。
1.基本索引和切片
当obj为int、slice对象或int和slice对象的元组时,将触发基本索引。通过切片(slice)生成的数组是原数组的视图。
注:在Python中,a[(exp1, exp2, ., expn)] <=>
a[exp1, exp2, ., expn] ,后者是前者的语法糖(syntax sugar)。
以二维数组a为例:
方法 | 描述 |
---|---|
a[0, 1] <=> a[0][1] | 整数索引,取一个元素,返回标量a[0][1]分别对a、a[0]进行索引,效率较低 |
a[start: stop: step] | 切片索引,下标取值范围[start, stop),步长step,当step=-1时为倒序 |
a[0, : ] | 切片索引,取一行,返回一维数组 |
a[0: 3, 1: 4] | 切片索引,取几行几列 |
b[ : , : , 0] <=> b[ ... , 0] | 切片索引,省略号 |
2.高级索引
返回原数组的副本。
注:a[ndarray1, ndarray2, ., ndarrayn] <=>
a[list1, list2, ., listn];如果索引是一个连续的整数列表[n, n+1, n+2, ..., N], 则可以等效为range(n, N+1)。
以二维数组a为例:
方法 | 描述 |
---|---|
a[[0], [1]] a[[0, 1], [1, 2]] <=> [a[0, 1], [1, 2]] | 整数数组索引,取一个或几个元素,返回一维数组,其长度和索引的长度相同 |
a[[0], : ] a[:, [1, 0]] <=> [a[:, 1], a[:, 0]] | 整数数组索引,保持维数不变 |
a[a>0] | 布尔索引,索引形状与a相同,返回一个包含符合条件的元素的一维数组 |
a = np.array([[0, 1, 2], [3, 4, 5]]) b = np.array([False, True]) >>> a[b] array([[3, 4, 5]]) | 布尔索引,用b中的元素索引a的行 |
a[[0, 1, 2]] <=> [a[0], a[1], a[2]] | 花式索引,保持维数不变 |
a = np.array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]]) b = np.array([[0, 1], [1, 2]]) >>> a[b] array([[[ 0, 1, 2, 3], [ 4, 5, 6, 7]], [[ 4, 5, 6, 7], [ 8, 9, 10, 11]]]) a[b].shape=(b.shape[0], b.shape[1], a.shape[1]) | 花式索引,a、b都为数组,用b中的元素索引a的行 |
a[np.ix_(*args)] a[np.ix_([0, 1], [1, 2])] <=> a[[[0], [1]], [1, 2]] <=> [[a[0, 1], a[0, 2]], [a[1, 1], a[1, 2]]] | 花式索引,arg为一维序列 |
四、数组广播
当运算中的两个数组有值为1的维度且其他维度相同时,numpy将自动触发广播机制。
五、数组方法
1.数组转换
方法 | 描述 |
---|---|
ndarray.tolist() | 将数组转换为列表 |
ndarray.astype(dtype) | 强制数据类型转换 |
ndarray.copy() | 返回原数组的副本 |
2.形状操作
方法 | 描述 |
---|---|
ndarray.reshape(shape) | 返回具有新形状的数组(视图) 注:ndarray.reshape可以传入独立的参数,而np.reshape只能传入tuple of ints,例如a.reshape(1,2) <=> a.reshpe((1,2)) |
ndarray.resize(shape) | 无返回值,更改原数组的形状 |
ndarray.flatten() | 返回一维数组(副本) |
ndarray.ravel() <=> ndarray.reshape(-1) | 返回一维数组(视图) |
ndarray.transpose(*axes) | 转置数组(视图) |
ndarray.squeeze(axis) | 删除值为1的维度(视图) |
np.expand_dims(ndarray, axis=0) <=> ndarray[np.newaxis, : ] <=> ndarray[None, : ] | 增加一个维度(视图) |
3.计算
默认axis=None, keepdims=False
方法 | 描述 |
---|---|
ndarray.max(axis, keepdims) | 返回给定轴上元素的最大值 |
ndarray.argmax(axis) | 返回给定轴上元素的最大值的索引 |
ndarray.min(axis, keepdims) | 返回给定轴上元素的最小值 |
ndarray.argmin(axis) | 返回给定轴上元素的最小值的索引 |
ndarray.sum(axis, keepdims) | 返回给定轴上元素的和 |
ndarray.cumsum(axis) | 返回给定轴上元素的累加和 |
ndarray.mean(axis, keepdims) | 返回给定轴上元素的平均值 |
ndarray.var(axis, keepdims) | 返回给定轴上元素的方差 |
ndarray.std(axis, keepdims) | 返回给定轴上元素的标准差 |
ndarray.prod(axis, keepdims) | 返回给定轴上元素的乘积 |
ndarray.clip(min, max) | 返回元素值限制为[min, max]的数组 |
np.maximum(x1, x2) | 比较两个数组对应元素的大小,返回最大值,两个数组形状不同时将触发广播机制 |
np.minimum(x1, x2) | 比较两个数组对应元素的大小,返回最小值,两个数组形状不同时将触发广播机制 |
np.multiply(x1, x2) <=> x1*x2 | 矩阵对应元素相乘,当x1、x2为np.mat()类型时,“*”表示矩阵相乘 |
np.dot(x1, x2) | 矩阵相乘,x1、x2可以为标量。当x1、x2为多维矩阵时,np.dot()的形状与np.matmul()不同 |
np.matmul(x1, x2) <=> x1@x2 | 矩阵相乘,x1、x2不能为标量。当x1、x2为二维矩阵时,np.matmul()等价于np.dot();当x1、x2为多维矩阵时,x1、x2的前n-2维维度不一致则进行广播,后两维进行矩阵相乘 |
4.逻辑函数
方法 | 描述 |
---|---|
ndarray.all(axis, keepdims) | 给定轴上所有元素都为True,则返回True |
ndarray.any(axis, keepdims) | 给定轴上有元素为True,则返回True |
np.logical_and(x1, x2) | 与运算 |
np.logical_or(x1, x2) | 或运算 |
np.logical_not(x) | 非运算 |
np.logical_xor(x1, x2) | 异或运算 |
5.数组堆叠与重复
方法 | 描述 |
---|---|
np.stack((a, b), axis=0) | 在新的维度上堆叠数组,a、b形状必须相同 |
np.vstack((a, b)) | 在第一维上堆叠数组 |
np.hstack((a, b)) | 在第二维上堆叠数组 |
np.concatenate((a, b), axis=0) | 在已有维度上堆叠数组 |
np.repeat(array_like, repeats, axis=None) | 重复数组元素,repeats可以是int或array of ints,表示a中的元素重复的次数,返回的数组除了给定的轴外形状与a相同 |
np.tile(array_like, repeats) | 重复数组,repeats可以是int或array of ints |
6.项目选择和操作
方法 | 描述 |
---|---|
ndarray.sort(axis) | 将数组中的元素从小到大排序。默认axis=-1,当axis=None时返回一维数组。ndarray.sort()也可以对结构化数组进行排序 |
ndarray.argsort(axis) | 将数组中的元素从小到大排序后返回对应的索引。默认axis=-1,当axis=None时返回一维数组 |
ndarray.searchsorted(a, v, side=left) | 检索v中元素在a中的索引 当side=left时,i满足a[i-1] < v <= a[i] 当side=right时,i满足a[i-1] <= v < a[i] |
ndarray.nonzero(array_like) <=> np.where(ndarray!=0) (a>3).nonzero() <=> np.where(a>3) | 返回一个长度为a.dim的坐标列表,列表元素是非零元素的各维坐标 |
np.where(condition, x=None, y=None) <=> np.where(ndarray!=0) | 当只有一个参数condition时(比如a>0),返回一个长度为a.dim的坐标列表,列表元素是满足条件的数组元素的各维坐标;当有三个参数时,x中不满足要求的元素由y赋值 |