NumPy 入门
1. n 维数组对象 ndarray 入门
存在的意义:
- 数组对象可以去除元素间运算所需的循环,使一维向量更像单个数据
- 数组对象采用相同的数据类型,有助于节省运算和存储空间(底层采用 C 语言)
构成:
- 实际存储的数据
- 描述这些数据的元数据(维度、数据类型)
- 所有元素类型相同,数组下标从 0 开始
操作:
生成数组 np.array()
import numpy as np
def npSum():
a = np.array([1, 2, 3, 4])
b = np.array([5, 6, 7, 8])
c = a ** 2 + b ** 3
return c
res = npSum()
res
array([126, 220, 352, 528], dtype=int32)
属性:
.axis: 保存数据的维度
.ndim(rank): 轴的数量
.shape: 对象尺寸,对于矩阵,n 行 m 列
.size: 对象元素的个数,相当于 n * m
.dtype: 元素类型
.itemsize: 每个元素的大小,以字节为单位
元素类型:
2. ndarray 数组创建:
- 从 Python 列表或元组创建:x = np.array(list/tuple, dtype=np.float32)
- 使用函数创建:
维度变换:
数据类型变换:
.astype(new_type) : 一定会创建一个新的拷贝数组,即使两个数据类型一致
.tolist() : 转换为 python 列表
对数组的操作:
- 一维数组的索引,和 Python 中类似 a[id]
- 一维数组的切片,和 Python 中类似 a[st: en: step]
- 多维数组索引,a[ax1, ax2, ax3]
- 多维数组的切片,a[st1: en1, st2: en2, st3: en3]
数组运算:
- 与标量运算:数组中的每一个元素都与该标量运算
- 一元函数:元素级运算,一般原数组都不改变
- 二元函数
3. Numpy 数据存取与函数
CSV 文件存取:只能存取一维和二维数组
- 写: np.savetxt(frame, array, fmt=‘%.18e’, delimiter=None)
- frame: 文件、字符串或产生器,可以是 .gz 或 .bz2 的压缩文件
- array: 写入文件的数组
- fmt: 写入文件的格式、如:%d %.2f %.18e
- delimiter: 分割字符串,默认是任何空格
- 读: np.loadtxt(frame, dtype=np.float, delimiter=None, unpack=False)
- unpack: 如果为 True,读入属性将分别写入不同变量
多维数据存取:
任意格式:维度等信息丢失
- 写:a.tofile(frame, sep=‘’, format=‘%s’)
- sep: 数据分割字符串,如果是空串,写入文件为二进制
- 写入文件后,数组的维度信息丢失
- 读:a.fromfile(frame, dtype=np.float, count=-1, sep=‘’)
- count: 读入文件个数,-1 表示整个文件
- 读出后的数组为一维数组,需要手动改变维度
Numpy 自定义的文件格式:保留维度等信息:数据用二进制存储,文件起始内容显示保存数组的其他信息
- 写:np.save(fname, array) 或 np.savez(fname, array)
参数:文件名称和数组名称 - save 文件名为 .npy,savez 文件名为 .npz
读:np.load(fname)
4. Numpy 随机数函数
import numpy.random.*
产生随机数:
- rand(d0, d1, …, dn): 根据 d0-dn 创建随机数数组,浮点数,[0, 1),均匀分布
- randn(d0, d1, …, dn): 标准正态分布
- randint(low, [high, shape]): 创建随机整数或整数数组,范围是 [low, high),默认符合均匀分布
- seed(s):随机数种子
随机排列:
- shuffle(a): 根据数组 a 的第一轴进行随机排列,改变数组 a
- permutation(a): 根据数组 a 的第一轴产生一个新的乱序数组,不改变数组 a
- choice(a[, size, replave, p]): 从一维数组 a 中以概率 p 抽取元素,形成 size 形状新数组,replace 表示是否可以重用元素,默认为 True
分布函数:
- uniform(low, high, size) 均匀分布
- normal(loc, scale, size) 正态分布,loc 均值,scale 标准差
- poisson(lam, size) 泊松分布,lam 随机事件发生率
Numpy 统计函数
a = np.arange(15).reshape(3, 5)
np.sum(a)
[0,1,2,3,4]
[5,6,7,8,9]
[10,11,12,13,14]
105
np.sum(a, axis=1) # 第一维度指 3,第二维度指 5
array([10, 35, 60])
np.mean(a)
7.0
np.mean(a, axis=0)
array([5., 6., 7., 8., 9.])
np.average(a, axis=0, weights=[10, 5, 1])
array([2.1875, 3.1875, 4.1875, 5.1875, 6.1875])
b = np.arange(15, 0, -1).reshape(3, 5)
np.max(b)
15
np.argmax(b) # 一维下标
0
np.unravel_index(np.argmax(b), b.shape) # 多维下标
(0, 0)
np.ptp(b)
14
np.median(b)
8.0
Numpy 梯度函数
np.gradient(f) :计算数组 f 中元素的梯度,当 f 为多维时,返回每个维度的梯度
- 梯度:连续值之间的变化率,即斜率
- 如 XY 坐标轴三个连续 X 坐标对应的 Y 轴值:a, b, c,其中,b 的 梯度是:(c-a)/2
a = np.random.randint(0, 20, (5))
a
array([14, 16, 0, 1, 6])
np.gradient(a)
# 边界值和中间值计算方法不同
# 2 == 16 - 14
# -7 == (0 - 14) / 2
# -7.5 == (1 - 16) / 2
# 3 == (6 - 0) / 2
# 5 == 6 - 1
array([ 2. , -7. , -7.5, 3. , 5. ])
c = np.random.randint(0, 50, (3, 5))
c
array([[11, 34, 27, 47, 48],
[45, 17, 44, 37, 3],
[47, 39, 19, 34, 31]])
np.gradient(c)
# 返回两个方向的梯度值
# 34 == 45 - 11 18 == (47 - 11) / 2 最外层维度的梯度值
# 23 == 34 - 11 8 == (27 - 11) / 2 第二层维度的梯度值
[array([[ 34. , -17. , 17. , -10. , -45. ],
[ 18. , 2.5, -4. , -6.5, -8.5],
[ 2. , 22. , -25. , -3. , 28. ]]),
array([[ 23. , 8. , 6.5, 10.5, 1. ],
[-28. , -0.5, 10. , -20.5, -34. ],
[ -8. , -14. , -2.5, 6. , -3. ]])]