【机器学习】Numpy的基本使用

Numpy:高效数组处理与科学计算
本文介绍了Numpy库如何加速Python中的数值计算,重点讲解了ndarray对象、多维数组操作、基本运算、广播机制、矩阵运算及其在数据处理中的应用。

1.Numpy优势

  1. Numpy介绍

    Numpy是一个开源的Python科学计算库,用于快速处理任意维度的数组。Numpy支持常见的数组和矩阵操作,对于同样的数值计算任务,使用Numpy比之间使用Python要简洁的多。

    Numpy使用ndarray对象来处理多维数组,该对象是一个快速而灵活的大数据容器。

  2. ndarray介绍

    Numpy提供了一个N维数组类型ndarray,它描绘了相同类型的“items”的集合。ndarray的数组底层经过优化,比使用Python原生的数组更快更迅速。但ndarray中所有的数据元素必须要统一类型,这也是ndarray的一大特点。

    由于机器学习的最大特点就是大量的数据运算,因此ndarray很适合这种应用场景。

2.N维数组ndarray

  1. ndarray的属性

    属性名称介绍
    ndarray.shape返回数组维度的元组
    ndarray.ndim返回数组维数
    ndarray.size返回数组中元素的数量
    ndarray.itemsize返回一个数组元素的长度,以字节为单位
    ndarray.dtype返回数组元素的类型
  2. ndarray的类型
    通过 type(ndarray.dtype) 获得数组对应的类型

    名称描述简写
    np.bool布尔类型,True or Flase‘b’
    np.int8一个字节大小, − 2 7 -2^7 27 ~ 2 7 − 1 2^7 - 1 271‘i’
    np.int16整数类型, − 2 15 -2^{15} 215 ~ 2 15 − 1 2^{15} - 1 2151‘i2’
    np.int32整数类型, − 2 31 -2^{31} 231 ~ 2 31 − 1 2^{31} - 1 2311‘i4’
    np.int64整数类型, − 2 63 -2^{63} 263 ~ 2 63 − 1 2^{63} - 1 2631‘i8’
    np.uint8无符号整数类型, 0 0 0 ~ 2 8 − 1 2^{8} - 1 281‘u’
    np.uint16无符号整数类型, 0 0 0 ~ 2 16 − 1 2^{16} - 1 2161‘u2’
    np.uint32无符号整数类型, 0 0 0 ~ 2 32 − 1 2^{32} - 1 2321‘u4’
    np.uint64无符号整数类型, 0 0 0 ~ 2 64 − 1 2^{64} - 1 2641‘u8’
    np.float16半精度浮点数类型,阶码5位,尾数10位‘f2’
    np.float32单精度浮点数类型,阶码8位,尾数23位‘f4’
    np.float64双精度浮点数类型,阶码11位,尾数52位‘f8’
    np.complex64单精度浮点复数类型‘c8’
    np.complex128双精度浮点复数类型‘c16’
    np.object_Python对象类型‘O’
    np.string_字符串类型‘S’
    np.unicode_Unicode类型‘U’

    可以在创建元素时通过dtype属性指定ndarray的类型,如:

    a = np.array([1,2,3], dtype=np.float32)
    

    若不指定,则整数默认为int64,小数默认float64

3.基本操作

3.1数组生成

  • 生成0-1数组:

    # 生成全1数组
    np.ones(shape[, dtype])
    # 例:生成4行3列的全1数组
    ones = np.ones([4, 3])
    
    # 生成全0数组
    np.zeros(shape[, dtype])
    # 例:生成4行3列的全0数组
    zeros = np.zeros([4, 3])
    
  • 从现有数组生成:

    # 深拷贝
    np.array(object, dtype)
    # 示例:
    a = np.array([1,2,3],[4,5,6])
    
    # 浅拷贝
    np.asarray(object, dtype)
    # 示例:
    a1 = np.asarray(a)
    
  • 生成固定范围的数组:

    1. 创建指定数量的等差数组
      np.linspace(start, stop, num, endpoint)
      参数:

      • start:序列的起始位置
      • stop:序列的终止位置
      • num:要生成的等间隔样例数量,默认为50
      • endpoint:序列是否包含stop位置的值,默认为True
      # 生成等间隔数组
      np.linspace(0, 100, 11)
      
    2. 创建指定步长的等差数组
      np.arange(start, stop, step, dtype)
      参数:

      • step:步长,默认为1
      # 生成指定步长的数组
      np.arange(10, 50, 2)
      
    3. 创建以10为底的等比数列
      np.logspace(start, stop, num)
      参数:

      • num:等比数列的元素数量,默认50
      # 获取1, 10, 100
      np.logspace(0, 2, 3)
      
  • 生成随机数数组:

    1. 正态分布随机数组的创建

      • np.random.randn(d0, d1,…,dn) 用于从标准正态分布中返回一个或多个样本值

      • np.random.normal(loc, scale, size) 模拟正态分布,loc为均值,scale为标准差,size为数组形状

        # 例1:生成均值为1.75标准差为1的一维正态随机数组10000000个
        np.random.normal(1.75, 1, 10000000)
        
        # 例2:随机生成4支股票1周的交易日涨幅数据
        np.random.normal(0, 1, (4, 5))
        
      • np.random.standard_normal(size) 返回指定形状的标准正态分布数组

    2. 均匀分布随机数组的创建

      • np.random.rand() 返回 [ 0 , 1 ) [0 , 1) [0,1)内的一组均匀分布的数
      • np.random.uniform(low, high, size)从一个均匀分布 [ l o w , h i g h ) [low, high) [low,high)中随机采样
      • np.random.randint(low, high, size, dtype)从一个随机分布中随机抽样,生成一个整数或N维整数数组

3.2数组的基本操作

  • 数组的索引、切片:
    可以使用Python原生的索引、切片方式,此处不再赘述

  • 形状修改:

    1. 返回一个具有相同数据域,但shape不一样的视图
      ndarray.reshape(shape)

    2. 修改数组本身的形状
      ndarray.resize(shape)

    3. 数组(矩阵)转置
      ndarray.T

  • 类型修改:

    1. 返回修改类型后的数组
      ndarray.astype(type)
    2. 构造包含数组中原始数据字节的Python字节
      ndarray.tostring()ndarray.tobytes()
  • 数组去重:
    np.unique(ndarray) 将ndarray中的元素去重,返回一个数组

3.3ndarray运算

  • 逻辑运算:

    # 生成10名同学,5门功课的数据
    score = np.random.randint(40, 100, (10, 5))
    
    # 取出最后4位同学的成绩,用于逻辑判断
    test_score = score[6:]
    
    # 逻辑判断,如果成绩不小于60标记为True,否则为False
    print(test_score > 60)
    
    # Bool赋值,将满足条件的设置为指定的值-布尔索引
    test_score[test_score > 60] = 1
    print(test_score)
    
  • 通用判断函数:

    • np.all()

      # 判断前两名同学成绩是否全部及格
      np.all(score[:2] > 60) # 返回False
      
    • np.any()

      # 判断前两名同学成绩是否有大于90分的
      np.any(score[:2] > 90) # 返回True
      
  • 三元运算np.where:

    # 将前四名学生的前4门成绩中,及格的设为1,不及格的设为0
    temp = score[:4, :4]
    np.where(temp >= 60, 1, 0) # 类似C语言中的三元运算符 ? :
    
  • 复合逻辑的运算:
    需要借助 np.logical_and()np.logical_or()

    # 将前四名学生的前4门成绩中,及格但不是优秀[60,90)的设为1,不及格的设为0
    temp = score[:4, :4]
    np.where(np.logical_and(temp >= 60, temp < 90), 1, 0)
    
    # 将前四名学生的前4门成绩中,不及格或优秀![60,90)的设为1,不及格的设为0
    np.where(np.logical_or(temp < 60, temp >= 90), 1, 0)
    
  • 统计运算:
    数据挖掘/机器学习领域中常用的统计指标:(axis=1时统计行;axis=0时统计列;默认统计全部)

    1. np.min(ndarray, axis) 计算最小值
    2. np.argmin(ndarray, axis) 计算最小值的索引
    3. np.max(ndarray, axis) 计算最大值
    4. np.argmax(ndarray, axis) 计算最大值的索引
    5. np.median(ndarray, axis) 计算中位数
    6. np.mean(ndarray, axis, dtype) 计算平均数
    7. np.std(ndarray, axis, dtype) 计算标准差
    8. np.var(ndarray, axis, dtype) 计算方差

3.4数组的运算

  • 数组与数的运算

    arr = np.array([1, 2, 3, 2, 1, 4])
    print(arr + 1) # [2 3 4 3 2 5] 所有元素都加1
    print(arr / 2) # [0.5 1. 1.5 1. 0.5 2.] 所有元素都除以2
    
  • 数组间的运算
    数组在进行矢量化运算时,要求数组的形状是相等的。当形状不相等的数组执行算术运算的时候,就会出现广播机制。该机制会对数组进行扩展,使数组的shape属性值一样,这样才能进行矢量化运算

    arr1 = np.array([[0],[1],[2],[3]])
    arr2 = np.array([1, 2, 3])
    print(arr1.shape) # (4,1) 四行一列
    print(arr2.shape) # (3,) 一行三列
    print(arr1 + arr2) # [[1,2,3],[2,3,4],[3,4,5],[4,5,6]] 四行三列
    

    广播机制实现了两个或两个以上数组的运算,即使这些数组的shape不是完全相同的,只要满足如下任意一个条件即可:

    • 数组的某一维度等长
    • 其中一个数组的某一维度为1

    广播机制需要扩展维度小的数组,使得它与维度最大的数组的shape值相同,以便使用元素级函数或者运算符进行运算

3.5 矩阵运算

  • 矩阵乘法API

    1. np.matmul
    2. np.dot

    二者区别:np.matmul中禁止矩阵与标量的乘法。在矢量乘矢量的内积运算中,np.matmul与np.dot没有区别

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值