人工智能科学计算numpy

人工智能

一、numpy

注:import numpy as np


1.将array转化成ndarray对象

array函数: Numpy模块中的array函数可以将Python原⽣列表类型转换为Numpy的ndarray类型。

  1. 创建数组

    • 语法: 使⽤ np.array() 函数,传⼊⼀个列表对象即可创建⼀维数组。

    • 示例: b = np.array([1, 2, 3, 4, 5, 6]),结果 b 是⼀个包含这些元素的⼀维数组。

    • 参数: dtype 参数,⽤于指定数组元素的数据类型,如 dtype=float 将元素转为浮点数。如: a = np.array([1, 2, 3, 4, 5, 6], dtype=complex),结果 a 是⼀个元素类型为复数的数组。

      ndmin 参数,⽤于指定⽣成数组的最⼩维度。如: a = np.array([1, 2, 3, 4, 5, 6], ndmin=3),结果 a 是⼀个形状为 (1, 1, 6) 的三维数组。

  2. 创建多维数组: 通过向array函数传递列表类型的参数可以⽣成多维数组,例如⼆维数组的每个列表元素代表⼀维数组的⼀⾏

    • ⽅法: 传⼊⼀个嵌套列表,即可创建⼆维数组。

    • 示例: a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]),结果 a 是⼀个 3x3 的⼆维数组

      import  numpy as np
      list1=[1,2,3,4,5]
      np.array(list1,dtype=float,ndmin=3)
      
      array([[[1., 2., 3., 4., 5.]]])
      

2.生成ndarray 对象

1>有规律
  1. numpy.arange(start, stop, step, dtype)

    ​ 起始值,终止值(不包含),步长(默认为1)

    • 示例: x = np.arange(0, 6, dtype=int),结果 x 是包含 [0, 1, 2, 3, 4, 5] 的⼀维整数数组
  2. np.zeros(shape)

    请添加图片描述

    全零数组:应⽤场景: 机器学习初始化参数、预分配数组空间

    请添加图片描述

    相似函数

    a=np.array([1,2,3,4,5])
    np.zeros_like(a)
    
    array([0, 0, 0, 0, 0])
    

  3. np.ones(shape)

    全⼀数组:
    特点: 与zeros()参数结构相同,仅填充值不同

    请添加图片描述

    相似函数

    a=np.array([1,2,3,4,5])
    np.ones_like(a)
    
    array([1, 1, 1, 1, 1])
    
  4. np.empty(shape)

    未初始化数组:
    o 优势: ⽐zeros()效率更⾼,适合⽴即赋值的场景
    o 注意: 内容不可预测,必须后续赋值使⽤,使用的是原来存储的数据

    请添加图片描述

  5. np.linspace(start,stop,num,endpoint,retstep,dtype)

    等分数组

    在这里插入图片描述

    np.linspace(1,100,50)
    #
    array([  1.        ,   3.02040816,   5.04081633,   7.06122449,
             9.08163265,  11.10204082,  13.12244898,  15.14285714,
            17.16326531,  19.18367347,  21.20408163,  23.2244898 ,
            25.24489796,  27.26530612,  29.28571429,  31.30612245,
            33.32653061,  35.34693878,  37.36734694,  39.3877551 ,
            41.40816327,  43.42857143,  45.44897959,  47.46938776,
            49.48979592,  51.51020408,  53.53061224,  55.55102041,
            57.57142857,  59.59183673,  61.6122449 ,  63.63265306,
            65.65306122,  67.67346939,  69.69387755,  71.71428571,
            73.73469388,  75.75510204,  77.7755102 ,  79.79591837,
            81.81632653,  83.83673469,  85.85714286,  87.87755102,
            89.89795918,  91.91836735,  93.93877551,  95.95918367,
            97.97959184, 100.        ])
    
  6. np.logspace()

    对数等分

    np.logspace(0,9,10,base=2)
    
    array([  1.,   2.,   4.,   8.,  16.,  32.,  64., 128., 256., 512.])
    

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

2>随机生成
  1. np.random.random(num)

    注:只能生成(0,1)的随机数,且size无法指定为NULL

    在这里插入图片描述

  2. np.random.randint(low,high=None,size=None )

    指定范围内的随机整数⽣成: np.random.randint(low, high=None, size=None)

    • 参数说明:

      • low: 随机整数的下界(包含)。
      • high: 随机整数的上界(不包含),默认为None。
      • size: 输出数组的形状。
    • 示例:

      arr = np.random.randint(10, size=10)⽣成⼀个包含10个[0, 10)范围内随机整数的⼀维数组。

      arr = np.random.randint(5, 10, size=(3, 4))⽣成⼀个3⾏4列的⼆维数组,元素为[5, 10)范围内的随机整数。

      在这里插入图片描述

  3. np.random.randn(d0, d1, …, dn)

    正态分布随机数⽣成:可以⽣成具有标准正态分布(期望为0,⽅差为1)的随机数。

    可以⽣成多维数组如size=(2, 3, 4)⽣成⼀个2x3x4的三维数组。

    在这里插入图片描述

    示例:
    o x = np.random.randn()⽣成⼀个标准正态分布的随机数。
    o **y = np.random.randn(2, 4)**⽣成⼀个2⾏4列的⼆维数组,元素为标准正态分布
    的随机数。
    o z = np.random.randn(2, 3, 4)⽣成⼀个2x3x4的三维数组,元素为标准正态分
    布的随机数。

  4. np.random.seed()【种子

    种⼦设定: 使⽤np.random.seed(seed)可以设定随机⽣成器的种⼦,使得每次运⾏⽣成的随机数序列相同。
    在这里插入图片描述

    随机数的生成是公式计算的结果,当控制一个seed之后输出的结果是一样的

  5. np.random.shuffle(x)
    就地随机排列: 使⽤np.random.shuffle(x)可以对序列x进⾏就地随机排列,不返回任何值。
    示例:
    o arr = np.array([1, 2, 3, 4, 5])创建⼀个数组。
    o np.random.shuffle(arr)对数组进⾏就地随机排列,arr的元素顺序会改变。

    list1=[1,2,3,4,5]
    np.random.shuffle(list1)
    list1
    
    [5, 2, 4, 3, 1]
    

在这里插入图片描述


3.ndarray数组的属性

  1. 同类型集合: ndarray是⼀系列同类型数据的集合,以零下标开始索引

    1. 内存结构(就可以使用切片操作): 每个元素在内存中有相同存储⼤⼩区域,包含:

      • 数据指针

      • 内存数据块

      • dtype描述元素类型

      • shape元组表示维度⼤⼩

    2. 核⼼属性:
      ndim: 维度数量(秩)
      shape: 数组维度形状(矩阵为n⾏m列)
      size: 元素总数(shape各维度乘积)
      dtype: 元素数据类型
      itemsize: 单个元素字节⼤⼩
      flags: 内存信息

在这里插入图片描述

4.ndarray数组的切片,索引,改维,拼接,分割,复制,转置
  1. 切片和索引

    访问⽅式: ndarray对象的内容可以通过索引或切⽚来访问和修改,与Python中list的切
    ⽚操作⼀样。
    索引参数: ndarray数组可以基于0-n的下标进⾏索引,并设置start, stop及step参数,从
    原数组中切割出⼀个新数组(但是新数组的地址仍然指向该数组,即为浅拷贝)。

  2. 改维

    1. reshape⽅法

      示例代码: arr = np.arange(12); arr = arr.reshape(4,3)

      解释: 将⼀维数组arr重塑为4⾏3列的⼆维数组。

      注意: 重塑时,新形状的元素总数必须与原数组相同,否则会报错。

    2. ravel方法

      作⽤: ravel函数可以将多维数组变成⼀维数组。
      示例:
      将三维数组b变成⼀维数组a1:a1 = b.ravel()
      特点: 不需要传⼊参数,直接调⽤即可实现降维。

    3. flatten函数同样可以将多维数组变成⼀维数组。

    4. ravel 和flatten

      在Numpy中,ravel返回的是数组的视图(view),⽽flatten返回的是数
      组的副本(copy),但在⼤多数情况下,⼆者效果相同。

  3. 拼接

    1. ⽔平拼接(hstack):
      使⽤hstack函数可以将两个或多个数组在⽔平⽅向(列⽅向)上进⾏拼接。
      示例:
      o 数组a为[[1,2,3],[4,5,6]]
      o 数组b为[[‘a’,‘b’,‘c’],[‘d’,‘e’,‘f’]]
      o 使⽤np.hstack([a,b])进⾏⽔平拼接,结果为
      [[‘1’,‘2’,‘3’,‘a’,‘b’,‘c’],[‘4’,‘5’,‘6’,‘d’,‘e’,‘f’]]

    2. 垂直拼接(vstack):

      使⽤vstack函数可以将两个或多个数组在垂直⽅向(⾏⽅向)上进⾏拼接。
      示例:
      o 数组a为[[1,2,3],[4,5,6]]
      o 数组b为[[‘a’,‘b’,‘c’,‘m’],[‘d’,‘e’,‘f’,‘n’]]使⽤np.vstack([a,b])进⾏垂直拼接,结果为
      [[‘1’,‘2’,‘3’],[‘4’,‘5’,‘6’],[‘a’,‘b’,‘c’,‘m’],[‘d’,‘e’,‘f’,‘n’]]

    3. concatenate:

      1)默认情况
      默认⾏为:
      np.concatenate函数在默认情况下(axis=0)会沿着第⼀个轴(⾏⽅向)进⾏拼接,相当于vstack。
      示例:
      o 数组a和b形状相同
      o 使⽤np.concatenate([a,b])或np.concatenate([a,b],axis=0),结果与vstack相同
      2)指明⽅向
      指定轴拼接: 可以通过axis参数指定沿着哪个轴进⾏拼接。
      示例:
      o axis=0时,按⾏拼接,相当于vstack
      o axis=1时,按列拼接,相当于hstack
      o 对于形状不⼀致的数组,拼接时除拼接轴外,其余轴的⻓度必须相同
      3)三维数组的拼接
      对于三维数组,可以沿着不同的轴(axis=0,1,2)进⾏拼接。
      示例:
      数组aa形状为(3,4,3)
      数组bb形状也为(3,4,3)
      使⽤np.concatenate([aa,bb], axis=0),结果形状为(6,4,3),即第⼀个维度拼接
      使⽤np.concatenate([aa,bb], axis=1),结果形状为(3,8,3),即第⼆个维度拼接
      使⽤np.concatenate([aa,bb], axis=2),结果形状为(3,4,6),即第三个维度拼接

  4. 分割(numpy.split(ary,indices_or_sections,axis))

    split⽅法: 使⽤np.split等⽅法可以分隔数组。

    在这里插入图片描述

    参数说明:
    o ary: 被分割的数组
    o indices_or_sections: 如果是整数则平均切分,如果是数组则指定切分位置
    o axis: 切分维度,默认为0(横向切分),1为纵向切分

    a=np.random.randint(1,10,10)
    np.split(a,2)
    
    
    [array([8, 6, 3, 9, 6]), array([7, 2, 2, 4, 9])]
    
    a=np.random.randint(1,10,size=(2,2))
    np.split(a,2)
    
    
    [array([[1, 1]]), array([[1, 6]])]
    

    整数切分: 传⼊整数4会将12个元素的数组平均分成4份,每份3个元素
    数组切分: 传⼊数组[3,5]会在索引3和5的位置切分,得到[0,1,2]、[3,4]、[5-11]三部分
    切分原理: 数组参数表示在哪些索引位置前进⾏切分

    横向切分:axis = 0时按⾏切分,将4⾏数组分成2个2⾏的⼦数组
    纵向切分:axis = 1时按列切分,需确保能整除,否则会报错
    错误处理: 对3列数组纵向切分2份会报错,需先reshape为可整除的形状

  5. 复制及深拷贝(arr1=np.copy(arr))

    copy函数: 使⽤np.copy函数可以实现数组的深拷⻉。
    ​ 示例代码: sub_array = np.copy(a[:2,:2])
    ​ 解释: 将数组a的前两⾏前两列复制到⼀个新的数组sub_array中,修改sub_array不
    ​ 会影响原数组a。
    注意: 直接通过切⽚操作取得的数组视图会与原数组共享内存,修改视图会影响原数
    ​ 组,使⽤copy可以避免这种情况。

    注:浅拷贝和深拷贝

    在这里插入图片描述

    在这里插入图片描述

  6. 转置(transpose)

    功能: 将数组的⾏列互换,相当于数学中的矩阵转置
    两种⽤法:
    o np.transpose(a)
    o a.transpose()

    多维转置: 可以指定轴顺序,如将1×3×3×4数组转为3×3×4×1
    形状变化: 转置后数组的shape会相应改变

    a=np.random.randint(1,10,size=(2,2))
    print(a)
    print(a.transpose([1,0]))
    
    [[3 8]
     [7 7]]
    [[3 7]
     [8 7]]
    
5.numpy的运算
  1. 算术函数

    • 基本运算法则(+,-,*,/)

      运算条件:当两个ndarray对象形状相同时,会进⾏对应位置的运算
      运算⽅式:⽀持直接使⽤运算符(+,-,*,/)或显式调⽤函数(add/subtract/multiply/divide)
      ⼴播机制:当数组形状不同时,NumPy会⾃动将较⼩数组"⼴播"扩展⾄较⼤数组的形状再进⾏运算

      ⼴播机制详解:当a(3x3)与b(1x3)运算时,b会被⾃动复制扩展为3x3的数组再进⾏运算

      np.random.seed(20)
      a=np.random.randint(1,10,size=(2,2))
      print(a)
      b=np.array([2,2])
      print(a*b)
      
      [[4 5]
       [7 8]]
      [[ 8 10]36
      484
      9.0
      8.455767262643882
      6.5
      [ 6. 12.]
      [[121 484]
       [  1   4]]
      [[3.31662479 4.69041576]
       [1.         1.41421356]]
      inf
      1
      22
      [[11 22]
       [ 1  2]]
      1
       [14 16]]
      

      输出参数:(out参数)

      np.random.seed(20)
      a=np.random.randint(1,10,size=(2,2))
      print(a)
      b=np.array([2,2])
      c=np.add(a,b,out=a)
      print(b)
      print(a)
      print(c)
      
      [[4 5]
       [7 8]]
      [2 2]
      [[ 6  7]
       [ 9 10]]
      [[ 6  7]
       [ 9 10]]
      
    • 数学函数

      • 三⻆函数:np.sin(), np.cos(), np.tan()

        ⻆度转换:需要先将⻆度转换为弧度(乘以np.pi / 180)
        在这里插入图片描述

      • 取整函数

        around():四舍五⼊,但需注意其舍⼊规则的特殊性
        floor():向下取整(地板函数)
        ceil():向上取整(天花板函数)

        实际应⽤:在机器学习中常⽤于批次数据量的计算

        注意事项:==around()函数在边界情况(如4.5)==的舍⼊⾏为可能与预期不符,建议谨慎使⽤

        a=np.random.random(10)
        print(a)
        np.around(a)
        
        [0.49794007 0.67941112 0.65078591 0.26879524 0.06732467 0.77144514
         0.48098413 0.32920641 0.51064106 0.26362883]
         array([0., 1., 1., 0., 0., 1., 0., 0., 1., 0.])
        
        a=np.random.random(10)*10
        print(a)
        np.around(a)
        
        [8.25823577 1.56391719 7.34300519 4.08643432 7.78687904 8.03970568
         7.86071444 5.92287019 6.64489203 6.46567287]
         array([8., 2., 7., 4., 8., 8., 8., 6., 7., 6.])
        
        a=np.array([1.5,2.5,3.5,4.5,5.5])
        np.around(a)
        
        array([2., 2., 4., 4., 6.])
        
        a=np.random.random(10)*10
        print(a)
        np.floor(a)
        
        [2.68290634 6.07767079 0.4815737  6.95500639 2.99271878 1.65635555
         3.3225194  1.65437746 9.14637981 2.84025006]
         array([2., 6., 0., 6., 2., 1., 3., 1., 9., 2.])
        
        a=np.random.random(10)*10
        print(a)
        np.ceil(a)
        
        [1.07607265 1.1700177  7.55523599 8.38894458 0.35537027 1.2144377
         8.91008055 5.15092234 9.24419012 5.8124263 ]
         array([ 2.,  2.,  8.,  9.,  1.,  2.,  9.,  6., 10.,  6.])
        
  2. 聚合函数

    求和运算:使⽤np.sum(temp)对数组[1,2,3,5,5]所有元素求和,结果为16

    乘积运算:np.prod(temp)计算所有元素乘积,结果为150
    均值计算:np.mean(temp)求得平均值为3.2
    ⽅差计算:np.var(temp)计算结果为2.56
    标准差:np.std(temp)得到1.6,与⽅差关系为 2.56 = 1.6

    中位数:np.median(temp)结果为3.0,与平均数不同,表示排序后中间位置的值
    幂运算:np.power(temp,2)对每个元素平⽅,得到[1,4,9,25,25],需注意必须传⼊两个参数
    开⽅运算:np.sqrt(temp)计算平⽅根,结果为36
    极值运算:
    o np.min(temp)取最⼩值1
    o np.max(temp)取最⼤值5
    o np.argmin(temp)返回最⼩值索引0
    o np.argmax(temp)返回第⼀个最⼤值索引3(多个相同值时取第⼀个)
    指数运算:
    o np.exp(10)计算e10≈22026.47
    o np.log(10)计算ln10≈2.3026
    o 两者互为反函数关系,满⾜ln(ex) = x
    数学特性:
    o 对数函数单调递增,保持极值位置不变
    o 对数化可将连乘转为连加:log(ab) = loga + logb
    o 在机器学习中常⽤于损失函数优化
    特殊值:
    o np.inf表示⽆穷⼤
    o 常⽤于数值计算中的边界条件处理

    a=np.array([[11,22],[1,2]])
    print(np.sum(a))
    print(np.prod(a))
    print(np.mean(a))
    print(np.std(a))
    print(np.median(a))
    print(np.median(a,axis=0))
    print(np.power(a,2))
    print(np.sqrt(a))
    print(np.inf)
    print(np.min(a))
    print(np.max(a))
    print(np.around(a))
    print(np.argmax(a))
    
    36
    484
    9.0
    8.455767262643882
    6.5
    [ 6. 12.]
    [[121 484]
     [  1   4]]
    [[3.31662479 4.69041576]
     [1.         1.41421356]]
    inf
    1
    22
    [[11 22]
     [ 1  2]]
    1
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值