NumPy支持各种索引和切片操作、数组转置和重塑操作、数组拼接和堆叠操作等。这些功能可以使用户方便地对数据进行处理、计算和分析。
基本操作
ndarray 数组与其他数据序列类似,也可以进行索引、切片和迭代。
1. 索引
一维与列表完全一致,多维时同理,这里直接用示例说明。
除了一些基本的索引操作,ndarray 也支持一些不一样的索引方式。
2. 切片
对 ndarray 进行切片操作与一维数组相同,用索引标记切片的起始和终止位置即可。因为 ndarray 可以是多维数组,在进行切片时,通常需要设定每个维度上的切片位置。
- 一维与列表完全一致,多维时同理。
- 所有的切片方式都是开区间(左闭右开)。
import numpy as np
# 创建一个 4×6 的二维数组
arr = np.random.randint(0, 100, size=(4, 6))
print('arr=\n', arr)
# 截取第 2 行到最后一行,第 2 列到第 4 列构成的 ndarray
arr1 = arr[1:, 1:4]
print('arr1=\n', arr1)
运行结果如下:
操作示例:
如果需要将数据反转进行切片也是可以的,例如:[3, 2, 7, 6, 8] -> [8, 7, 3]
import numpy as np
arr = np.array([3, 2, 7, 6, 8])
arr1 = arr[::-2]
除此之外,Numpy 还提供了一个 copy()
方法,可以根据现有的 ndarray 数组创建新的 ndarray 数组。使用 copy()
方法与切片,可以用原数组的一部分生成新数组。
import numpy as np
# 创建一个 4×6 的二维数组
arr = np.arange(24).reshape(4, 6)
# 切片复制 arr 的第 2 行到第 4 行、第 1 列到第 3 列
arr1 = np.copy(arr[1:4, 0:3])
# 复制 arr1 到 arr_Copy
arr_Copy = arr1.copy()
3. 迭代
ndarray 可以通过
for
循环实现迭代。当维数多于一维时,迭代操作使用嵌套的循环。
迭代时,通常按照第一条轴(默认为行)对二维数组进行扫描。如果需要按其他维度迭代,可以使用 apply_along_axis(func, axis, arr)
函数指定当前处理的轴。
此外,Numpy 还包含一个循环迭代器类 numpy.nditer
,所生成的迭代器(Iterator)对象是一个根据位置进行遍历的对象。这是一个有效的多维迭代器对象,与 Python 内置的 iter()
类似,每个数组元素可使用迭代器对象来访问,从而方便地对数组进行遍历。
【例 3.1】 使用嵌套 for 循环对 ndarray 数组进行遍历迭代遍历。
【例 3.2】 使用 nditer 对象对 ndarray 数组进行遍历迭代。
4. 变形
使用
reshape
函数,注意参数是一个 元组(tuple)。前面已多次使用,就不再赘述。
5. 级联
注意:级联的时候,如果是横向级联,参与级联的数组的行数要一致;纵向级联,参与级联的数组的列数要一致;如果是高维度数组级联,级联的维度的数据个数要一致。
(1)- np.concatenate()
级联需要注意的点:
- 级联的参数是列表,一定要加中括号或小括号
- 维度必须相同
- 形状相符
- 级联的方向默认是
shape
,这个 tuple 的第一个值所代表的维度方向 - 可通过
axis
参数改变级联的方向
具体示例:
(2)- np.hstack
& np.vstack
水平级联与垂直级联,处理自己,进行维度的变更,按方向(行,列顺序)堆叠数组构成一个新的数组,堆叠的数组需要具有相同的维度。
具体示例(沿用上述中的数组):
6. 分割
与级联类似,有以下四个函数完成切分工作:
函数 | 数组及操作 |
---|---|
np.split | 将一个数组分割为多个子数组 |
np.hsplit | 将一个数组水平分割为多个子数组(按列) |
np.vsplit | 将一个数组垂直分割为多个子数组(按行) |
np.dsplit | 在第三个轴上进行深度切割 |
参数上也都大致类似,不同的是进行哪个维度的切分。
这里以 np.split 为例,格式为: numpy.split(ary, indices_or_sections, axis=0)
。
参数 | 描述 |
---|---|
ary | 要被切分的数组 |
indices_or_sections | 如果是一个整数,就用该数平均切分,如果是一个数组,为沿轴切分的位置 |
axis | 沿着哪个维度进行切向,默认为0,横向切分 |
具体示例:
7. 副本
所有赋值运算不会为 ndarray 的任何元素创建副本。对赋值后的对象的操作也对原来的对象生效。可使用
copy()
函数创建副本。前面也有介绍过,可点击此处。
计算(聚合)操作
ndarray 也可以直接进行基本运算,包括条件运算、统计运算以及基本数组运算等。
1. 条件运算
Numpy 中的条件表达式 condition 的值返回特定的数组。当条件为真时返回 x 数组,条件为假时返回 y 数组。
【例 3.1】简单条件运算
【例 3.2】用 np.where() 函数实现数据筛选
2. 统计运算
Numpy 提供了丰富的统计函数,简单来讲就是对一组数据去求它的某项指标,如最值。下表给出一些常见的统计函数:
Function Name | NaN-safe Version | Description |
---|---|---|
np.sum | np.nansum | Compute sum of elements |
np.prod | np.nanprod | Compute product of elements |
np.mean | np.nanmean | Compute mean of elements |
np.std | np.nanstd | Compute standard deviation |
np.var | np.nanvar | Compute variance |
np.min | np.nanmin | Find minimum value |
np.max | np.nanmax | Find maximum value |
np.argmin | np.nanargmin | Find index of minimum value |
np.argmax | np.nanargmax | Find index of maximum value |
np.median | np.nanmedian | Compute median of elements |
np.percentile | np.nanpercentile | Compute rank-based statistics of elements |
np.any | N/A Evaluate | whether any elements are true |
np.all | N/A Evaluate | whether all elements are true |
np.power | 幂运算 |
这里给出一些示例:
矩阵操作
1. 基本矩阵操作
算术运算(即加减乘除):在数学矩阵是可以乘以或除以一个常数。
这里以矩阵积 np.dot()
为例:
2. 广播机制
重要:ndarray 广播机制的两条规则
- 规则一: 为缺失的维度补维度
- 规则二: 假定缺失元素用已有值填充,目的就是为了保证参与运算的两个数组形状一致。
广播机制的原则:
- 就是要把缺失的那些行或者列补充完整
- 我们可以把一个常数向任何一个矩阵或者向量进行广播,用常数来填补整个扩展的矩阵
- 向量可以向形状类似的举证广播(比如行向量可以向列数与其一致矩阵广播),向量在向矩阵广播的时候,用向量的行(或列)取填补扩展的矩阵
示例:
import numpy as np
arr = np.array([1, 2, 3, 4, 5])
data = 3
arr + data
# 运行结果 : array([4, 5, 6, 7, 8])
ndarray 的排序
1. 快速排序
np.sort()
与 ndarray.sort()
都可以,但有区别:
np.sort()
不改变输入ndarray.sort()
本地处理,不占用空间,但改变输入
示例:
2. 部分排序
有的时候我们不是对全部数据感兴趣,可能只对最小或最大的一部分感兴趣。就可以使用 np.partition(a, k)
进行排序。
- 当 k 为正时,我们想要得到最小的 k 个数
- 当 k 为负时,我们想要得到最大的 k 个数
除上述一些操作外,NumPy 还有更多的功能和方法,如果您想要深入学习和运用NumPy,建议查看官方文档及相应教程。
点个赞