python01-numpy相关
🌟 numpy
Numpy 是 Numerical Python 的简称,是Python中高性能科学计算和数据分析的基础包。 Numpy 提供了一个 多维数组类型 ndarray, 具有矢量计算、复杂广播能力,可实现 快速的计算并且能节省存储空间。在使用Python调用飞桨API完成深度学习任务的过程中,通常会使用Numpy实现数据预处理和一些模型指标的计算,飞桨中的Tensor数据可以很方便的和ndarray数组进行相互转换。
🌙 1.基础数据结构ndarray数组
-
1.1为什么引入ndarray数组?
在 python 中使用list列表可以很灵活的处理多个元素的操作,但是效率较低。ndarray数组相较 python中list有以下特点:- 速度快:ndarray 数组中所有元素的 数据类型 是相同的,数据地址 是连续的,批量操作 数组元素时速度更快; list列表中元素的数据类型可以不同,需要通过寻址方式找到下一个元素。
- 广播:ndarray数组中实现了比较成熟的广播机制,矩阵计算时不需要写 for 循环。
- Numpy 底层用C语言编写的,内置了并行计算功能,运行速度高于 纯 python 代码。
-
1.2如何创建ndarray数组?
- 从list列表创建
a = [1, 2, 3, 4, 5] b = np.array(a)
- 指定起止范围及间隔创建 [start, end)
a = np.arange(0, 4, 2) # array([0, 2])
- 创建全为0的ndarray数组
a = np.zeros([2, 2]) # [[0, 0],[0, 0]]
- 创建全为1的ndarray数组
a = np.ones([2, 2]) # [[1, 1], [1, 1]]
- empty创建空矩阵:a_empty = np.empty((3,4))
- eye创建单位矩阵:a_eye = np.eye(3)
- 查看 ndarray数组 的属性: shape、dtype、元素个数、维度ndim等。
* 数组的数据类型: ndarray.dtype * 数组的形状: ndarray.shape 1维数组(N, ),二维数组(M, N),三维数组(M, N, K) * 数组的维度大小: ndarray.ndim, 其大小等于 nadarray.shape 所包含元素的个数 * 数组中包含的元素个数: ndarray.size, 其大小等于各个维度的长度的乘积 a = np.ones([3, 3]) a.dtype # float64 a.shape # (3, 3) a.ndim # 3 a.size # 9
- 改变 ndarray 数组的数据类型和形状
# 转换数据类型 b = a.astype(np.int64) # 改变形状 c = a.reshape([1, 9]) # [3, 3]
- 从list列表创建
-
1.3ndarray数组的基本运算
- 标量和 ndarray数组之间的运算
# 1)标量除以数组,用标量除以数组的每一个元素 arr = np.array([[1, 2, 3], [4, 5, 6]]) 1. / arr # array([[1, 0.5, ...],[]]) # 2)标量乘以数组,用标量乘以数组的每一个元素 # 3)标量加上数组,用标量加上数组的每一个元素 # 4)标量减去数组,用标量减去数组的每一个元素
- 两个 ndarray 数组之间的计算
# 数组 减去 数组, 用对应位置的元素相减 # 数组 加上 数组, 用对应位置的元素相加 # 数组 乘以 数组,用对应位置的元素相乘 # 数组 除以 数组,用对应位置的元素相除 # 数组开根号,将每个位置的元素都开根号
- 标量和 ndarray数组之间的运算
-
常用矩阵函数
- 矩阵的合并可以通过numpy中的 np.hstack 方法和 np.vstack 方法实现
- np.sin(a): 对矩阵a中每个元素取正弦,sin(x)
- np.cos(a) 对矩阵a中每个元素取余弦,cos(x)
- np.tan(a) 对矩阵a中每个元素取正切,tan(x)
- np.arcsin(a) 对矩阵a中每个元素取反正弦,arcsin(x)
- np.arccos(a) 对矩阵a中每个元素取反余弦,arccos(x)
- np.arctan(a) 对矩阵a中每个元素取反正切,arctan(x)
- np.exp(a) 对矩阵a中每个元素取指数函数,ex
- np.sqrt(a) 对矩阵a中每个元素开根号√x
- 矩阵的逆: import numpy.linalg as lg, lg.inv(a)
-
阵乘法(点乘):矩阵乘法必须满足矩阵乘法的条件,即第一个矩阵的列数等于第二个矩阵的行数
-
1.4ndarray数组的切片和索引
# 将一个标量值赋值给一个切片时,该值会自动传播到整个选区 # 数组切片是原始数组的视图。这意味着数据不会被复制, # 视图上的任何修改都会直接反映到源数组上 # 通过copy给新数组创建不同的内存空间 a = np.arange(30) arr_slice = a[4:7] arr_slice = np.copy(arr_slice) #自己给自己拷贝 arr_slice[0] = 100 a, arr_slice a 不变, arr_slice变化 索引同 paddle data[:2][:2] != data[:2, :2]
-
1.5ndarray数组的统计运算
- mean 均值: array.mean() np.mean(x)
- std 标准差: array.std() np.std(x)
- var 方差: array.var() np.var(x)
- sum 求和: array.sum() np.sum(x)
- 累积和: a.cumsum(axis=0)
- max 最大值: arrar.max(axis=)/np.max(arr, axis=)
- 最大值索引: array.argmax(axis=...)
- min 最小值: array.min(axis=)
- 最小值索引: array.argmin(axis=...)
- 中位数: np.median(x,axis=0)
🌙 2.随机数numpy.random
-
2.1创建随机ndarray数组
- 生成均匀分布随机数,随机数取值范围在[0, 1)之间
a = np.random.rand(3, 3)
- 生成均匀分布随机数,指定随机数取值范围和数组形状
a = np.random.uniform(low= -1.0, high= 1.0, size= (2, 2))
- 生成标准正态分布随机数
a = np.random.randn(3, 3) # shape指定不能用 tuple/list
- 生成正太分布随机数,指定均值mean 和方差 scale
a = np.random.normal(loc=1.0, scale=1.0, size=(3,3))
- 生成均匀分布随机数,随机数取值范围在[0, 1)之间
-
2.2设置随机数种子
np.random.seed(10) #设置随机数种子,每次都产生同样的随机数
-
2.3随机打乱顺序
np.random.shuffle(a) 随机打乱1维数组顺序时,发现所有元素位置都改变了; 随机打乱二维数组顺序时,发现只有行的顺序被打乱了,列的顺序保持不变
-
2.4随机选取元素
# 随机选取一部分元素 a = np.arange(30) b = np.random.choice(a, size= 50) # size如果大于30,则有重复的数字
python基础整理
numpy
1. ndarry 介绍: 矢量计算、复杂广播、快速省空间
2. ndarray 创建
2.1 np.array(a)
2.2 np.zeros([10,10])
2.2 np.ones([10,10])
2.2 np.arange(0, 10, 2)
2.3 随机数
2.3.1 随机数种子设定:np.random.seed()
2.3.2 均匀分布: np.random.rand() / .uniform() / .randint()
2.3.3 正态分布: np.random.normal() / .randn()
2.3.4 随机数shuffle: np.random.shuffle()
3. ndarray 查看数组类型变量的属性b.size/.shape/.ndim/.dtype
4. ndarry 索引和切片: 和python list不同,是原始数组的视图
5. adarry 数学、统计方法
axis=n, 就是把其他维度都固定住,在当前维度n进行进一步计算。
6. 线性代数相关函数:求 矩阵乘法、秩、矩阵分解、特征值
- 面好多方法不能直接调用
7. 文件操作: 文本文件独取/二进制文件保存/二进制文件读取
8. numpy 应用
8.1 sigmod、relu实现
8.2 图像翻转、裁剪、亮度调整、下采样
8.3 作业