机器学习(4)- Numpy

Numpy

一. Numpy的优势[重点]

  • 是什么: 是一个Python开源科学计算库
  • 核心类: ndarray, 用于表示任意维度的数字
  • numpy优势:
    1. 内存风格:
      ndarray: 元素直接就是数据, 要求元素类型必须一致, 速度快
      list: 元素是真实数据的地址, 数据类型可以不一致, 速度慢
    2. ndarray; 支持向量化并行运算
    3. numpy底层使用C语言实现的, 解除GIL锁限制, 所以速度更快.

二. N维数组-ndarray[*]

  1. 属性:
    • 形状: shape (重点)
    • 维度: ndim
    • 元素个数: size
    • 元素元素长度(字节) : itemsize
    • 元素数据类型: dtype
  2. 数据类型:
    • 整数: np.int32, np.int64
    • 浮点数: np.float64
    • 字符串: np.string_

三. 基本操作[***]

1 生成数组的方法

  1. 生成0和1的数组

    • 根据形状生成全1的数组:
      • np.ones(shape, dtype)
    • 根据已知数组的形状生成全1的数组:
      • np.ones_like(数组, dtype)
    • 根据形状生成全0的数组:
      • np.zeros(shape, dtype)
    • 根据已知数组的形状生成全0的数组:
      • np.zeros_like(数组, dtype)
  2. 从现有数组生成

    • 深拷贝: np.array(), 产生新的内存空间
    • 浅拷贝: np.asarray() , 只是赋值操作, 拷贝的引用.
  3. 生成固定范围的数组

    • 生成等间隔数组(重点):
      • 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)
  4. 均匀分布

    • 概念: 生成的数组中每一个元素是等概率的.
    • 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()
    
    
  5. 正态分布

    1. 正态分布概念:N(均值, 方差)
      1. 均值决定了 正态分布的位置
      2. 方差决定了正态分布的 形状(高瘦矮胖), 方差越小越高瘦, 方差越大越矮胖
      3. 方差与标准差意义: 方差与标准差越大数据越离散, 方差与标准差越小数据越集中.
  6. 标准正态分布: 均值为0, 方差为1的正态分布.

    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(新形状)
  • 数组转置: 行列互换

    扫描二维码关注公众号,回复: 8937913 查看本文章
    • ndarray.T

4.类型修改

  • 获取新类型的ndarray:
    • ndarray.astype(新类型)
  • 把ndarray转为二进制数据:
    • ndarray.tostring()

5.数组的去重

  • np.unique(需要去重的数组)
  • 返回的是一个去重后的一维数组

四. ndarray运算[**]

  1. 逻辑运算

    • 比较运算符

      • >,<, >= ,<=, != 
        
    • 原理: 数组中每一个元素与指定的数进行比较, 如果满足条件对应位置上就是True, 否则就是False

    • 修改满足条件数据:

      • ndarray[条件表达式] = 值
      # 判断股票的涨幅是否大于0.5
      
      tmp > 0.5
      
      # 把满足条件数据全部修改为1
      
      tmp[tmp > 0.5] = 1
      
  2. 通用判断函数

    • 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)
    
  3. 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)
    
  4. 统计运算

    • 最小值: 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)

五. 矩阵[*]

  • 矩阵: 可以理解为是一个二维数组 把一个矩阵记为A, 元素记为A_ij; m行n列矩阵就记为(mXn)的矩阵.
  • 向量: 只有列矩阵就是列向量, 只有一行的矩阵就是行向量;
  • 矩阵加法: 前提: 同型矩阵 , 对应位置的元素相加
  • 矩阵与标量相乘: 矩阵中每一个元素与标量相乘得到一个新矩阵
  • 矩阵相乘*****
    • (MxL) * (LxN) = (MxN)
  • 矩阵乘法性质:
    1. 不满足 交换律
    2. 满足 结合律
  • 单位矩阵:
    • 主对角线元素全为1, 其他位置元素全为0
  • 性质; 任意矩阵乘以单位矩阵都是它本身
  • 矩阵的逆: A的逆*A = A*A的逆 = 单位矩阵(I/E))
  • 矩阵转置: 行列互换.

六. 数组间运算[**]

  1. 数组与数的运算
    • 特点: 数组中每一个元素都与数进行运算, 生成一个新数组
    • 支持: +, -, *, /
  2. 数组与数组的运算
    • 广播机制(数组与数组间可以运算的规则):
      1. 维度相同
      2. 形状对应位置其中一方为1
  3. 矩阵运算
    • 矩阵乘法
      • np.matmul(矩阵1, 矩阵2)
      • np.dot(矩阵1, 矩阵2)
    • 相同点:
      • 都可以实现矩阵乘法运算
    • 不同点:
      • np.matmul只能做矩阵的乘法, 不能做矩阵与标量的乘法
      • np.dot可以做矩阵间乘法, 也可以做矩阵与标量的乘法.
发布了112 篇原创文章 · 获赞 289 · 访问量 14万+

猜你喜欢

转载自blog.csdn.net/WeiLanooo/article/details/102533161
今日推荐