Numpy
一. Numpy的优势[重点]
- 是什么: 是一个Python开源科学计算库
- 核心类: ndarray, 用于表示任意维度的数字
- numpy优势:
- 内存风格:
ndarray: 元素直接就是数据, 要求元素类型必须一致, 速度快
list: 元素是真实数据的地址, 数据类型可以不一致, 速度慢 - ndarray; 支持向量化并行运算
- numpy底层使用C语言实现的, 解除GIL锁限制, 所以速度更快.
- 内存风格:
二. N维数组-ndarray[*]
- 属性:
- 形状: shape (重点)
- 维度: ndim
- 元素个数: size
- 元素元素长度(字节) : itemsize
- 元素数据类型: dtype
- 数据类型:
- 整数: np.int32, np.int64
- 浮点数: np.float64
- 字符串: np.string_
三. 基本操作[***]
1 生成数组的方法
-
生成0和1的数组
- 根据形状生成全1的数组:
- np.ones(shape, dtype)
- 根据已知数组的形状生成全1的数组:
- np.ones_like(数组, dtype)
- 根据形状生成全0的数组:
- np.zeros(shape, dtype)
- 根据已知数组的形状生成全0的数组:
- np.zeros_like(数组, dtype)
- 根据形状生成全1的数组:
-
从现有数组生成
- 深拷贝: np.array(), 产生新的内存空间
- 浅拷贝: np.asarray() , 只是赋值操作, 拷贝的引用.
-
生成固定范围的数组
- 生成等间隔数组(重点):
- np.linspace(start, end, nums, endpoint, dtype)
- 根据起始值,结束值以及步长生成数组(类似于Python的range方法)(重点):
- np.arange(start, end, step, dtype)
- 从10^start, 10^end生成num个等比序列:
- np.logspace(start, end, num)
- 生成等间隔数组(重点):
-
均匀分布
- 概念: 生成的数组中每一个元素是等概率的.
- API: np.random.uniform(low, high, size)
- 参数:
- low: 下限
- high: 上限(不包含)
- size: 形状
# 绘制均匀分布的分布图 import matplotlib.pyplot as plt # 准备数据 arr = np.random.uniform(size=10000000) # 创建画布 plt.figure(figsize=(20, 8), dpi=100) # 绘制直方图 plt.hist(arr, bins=1000) # 展示 plt.show()
-
正态分布
- 正态分布概念:N(均值, 方差)
- 均值决定了 正态分布的位置
- 方差决定了正态分布的 形状(高瘦矮胖), 方差越小越高瘦, 方差越大越矮胖
- 方差与标准差意义: 方差与标准差越大数据越离散, 方差与标准差越小数据越集中.
- 正态分布概念:N(均值, 方差)
-
标准正态分布: 均值为0, 方差为1的正态分布.
- API:
-
np.random.normal(loc=0, scale=1, size)
# 绘制正态分布图 # 生成一组符合正态分布的数 arr = np.random.normal(loc=0, scale=1, size=10000000) # 创画布 plt.figure(figsize=(20, 8), dpi=100) # 绘图(直方图) plt.hist(arr, bins=1000) # 显示 plt.show()
2.数组的索引、切片
- 切片: arr[起始索引:结束索引(不包含) , [起始索引:结束索引(不包含) , …]
- 索引: [索引1, 索引2, …]
````python
# 索引
# 获取第一只股票的数据
stock_change[0]
# 第二只股票第二天的数据
stock_change[1,1]
# 切片
# 获取第二只到第五只(不包含)股票数据
stock_change[1:5]
# 获取第二只到第五只(不包含)股票前4天的数据
stock_change[1:5, 0:4]
# 所有股票的第二天的数据
stock_change[:, 1:4]
3.形状修改
-
返回相同元素新形状ndarray:
- ndarray.reshape(新形状)
-
修改原数组的形状:
- ndarray.resize(新形状)
-
数组转置: 行列互换
- ndarray.T
4.类型修改
- 获取新类型的ndarray:
- ndarray.astype(新类型)
- 把ndarray转为二进制数据:
- ndarray.tostring()
5.数组的去重
- np.unique(需要去重的数组)
- 返回的是一个去重后的一维数组
四. ndarray运算[**]
-
逻辑运算
-
比较运算符
-
>,<, >= ,<=, !=
-
-
原理: 数组中每一个元素与指定的数进行比较, 如果满足条件对应位置上就是True, 否则就是False
-
修改满足条件数据:
- ndarray[条件表达式] = 值
# 判断股票的涨幅是否大于0.5 tmp > 0.5 # 把满足条件数据全部修改为1 tmp[tmp > 0.5] = 1
-
-
通用判断函数
- np.all(条件表达式); 所有都是True,才是True
- np.any(条件表达式): 只要有True, 就是True
# 判断stock_change[0:2, 0:5]是否全是上涨的 # all: 所有都是True,才是True np.all(stock_change[0:2, 0:5] > 0) # 判断stock_change[0:2, 0:5]是否有上涨的 # any: 只要有True, 就是True np.any(stock_change[0:2, 0:5] > 0)
-
np.where(三元运算符)
- np.where(条件表达式, 满足条件的值, 不满足条件的值)
- 逻辑与(并且)
- np.logical_and(条件1, 条件2, …)
- 逻辑或(或者)
- np.logical_or(条件1, 条件2, … )
# 判断前四个股票前四天的涨跌幅 大于0的置为1,否则为0 np.where(tmp>0, 1, 0) # 判断前四个股票前四天的涨跌幅 大于0并且小于1的,换为1,否则为0 # np.logical_and(tmp>0, tmp<1) np.where(np.logical_and(tmp>0, tmp<1), 1, 0) # 判断前四个股票前四天的涨跌幅 大于0.5或者小于-0.5的,换为1,否则为0 # np.logical_or(tmp>0.5, tmp<-0.5) np.where(np.logical_or(tmp>0.5, tmp<-0.5), 1, 0)
-
统计运算
- 最小值: np.min(数组, axis=1)
- 注意: 没有指定axis就是整体统计, axis=1=0按列统计, axis=1按行统计.
- 最大值: np.max(数据, axis=1)
- 中位数: np.median(数据, axis=1)
- 中位数: 从小到大排序, 如果元素个数是奇数, 最中间那个数, 如果元素个数是偶数, 中间那两个数的均值
- 平均值: np.mean(数组, axis=1)
- 方差: np.var(数组, axis=1)
- 标准差: np.std(数组, axis=1)
- …
- 最大值所在的索引: np.argmax(数组, axis=1)
- 最小值所在的索引: np.argmin(数组, axis=1)
- 最小值: np.min(数组, axis=1)
五. 矩阵[*]
- 矩阵: 可以理解为是一个二维数组 把一个矩阵记为A, 元素记为A_ij; m行n列矩阵就记为(mXn)的矩阵.
- 向量: 只有列矩阵就是列向量, 只有一行的矩阵就是行向量;
- 矩阵加法: 前提: 同型矩阵 , 对应位置的元素相加
- 矩阵与标量相乘: 矩阵中每一个元素与标量相乘得到一个新矩阵
- 矩阵相乘*****
- (MxL) * (LxN) = (MxN)
- 矩阵乘法性质:
- 不满足 交换律
- 满足 结合律
- 单位矩阵:
- 主对角线元素全为1, 其他位置元素全为0
- 性质; 任意矩阵乘以单位矩阵都是它本身
- 矩阵的逆:
A的逆*A = A*A的逆 = 单位矩阵(I/E))
- 矩阵转置: 行列互换.
六. 数组间运算[**]
- 数组与数的运算
- 特点: 数组中每一个元素都与数进行运算, 生成一个新数组
- 支持: +, -, *, /
- 数组与数组的运算
- 广播机制(数组与数组间可以运算的规则):
- 维度相同
- 形状对应位置其中一方为1
- 广播机制(数组与数组间可以运算的规则):
- 矩阵运算
- 矩阵乘法
- np.matmul(矩阵1, 矩阵2)
- np.dot(矩阵1, 矩阵2)
- 相同点:
- 都可以实现矩阵乘法运算
- 不同点:
- np.matmul只能做矩阵的乘法, 不能做矩阵与标量的乘法
- np.dot可以做矩阵间乘法, 也可以做矩阵与标量的乘法.
- 矩阵乘法