zoukankan      html  css  js  c++  java
  • Numpy(上)

    简单来说,Numpy 是 Python 的一个科学计算包,包含了多维数组以及多维数组的操作。Numpy 的核心是 ndarray 对象,这个对象封装了同质数据类型的n维数组。起名 ndarray 的原因就是因为是 n-dimension-array 的简写。ndarray中的每个元素在内存中使用相同大小的块。 ndarray中的每个元素是数据类型对象的对象(称为 dtype)。

    一、构建ndarray:从Python列表创建数组

    import  numpy as np
    
    np.array()

        np.array(object, dtype=None)

    object:转换的数据
    
    dtype : 数据类型

    二、数据类型

    Numpy 中的数组比 Python 原生中的数组(只支持整数类型与浮点类型)强大的一点就是它支持更多的数据类型。

    请记住,不同于 Python 列表,NumPy 要求数组必须包含同一类型的数据。如果类型不匹配,NumPy 将会向上转换(如果可行)。

    让我们来领会一下什么叫做向上转换:整数-小数-字符串……

    三、Numpy 的矢量化(向量化)功能

    a = [[1, 2, 3], [5, 7, 8], [4, 5, 6]]
    b = [[6, 2, 1], [2, 3, 1], [4, 5, 6]]
    
    # 转换nparray
    a1 = np.array(a)
    b1=  np.array(b)
    
    a1 + b1
    a1*b1
    a1 / b1
    a1 + 5
    a1 * 3
    a1 ** 2

    for循环是“遍历”,python数据类型是不一样的,但是在Numpy中数据是一样的,矢量化是“一次性”,这就是数组运算的意思。

    矢量化代码有很多优点,其中包括:

    • 矢量化代码更简洁易读
    • 更少的代码行通常意味着更少的错误
    • 该代码更接近地类似于标准数学符号(使得更容易,通常,以正确地编码数学构造)
    • 矢量化导致更多的“Pythonic”代码。如果没有向量化,我们的代码将会效率很低,难以读取for循环。

    四、创建常用的数组

    单位矩阵,全零矩阵,三角矩阵等常用的矩阵数组,在线性代数的辅助计算中有很多特殊的作用。下面我们来看一下如何创建这些矩阵数组:

    1.全0数组

    np.zeros((3, 5))
    

    2.全1数组

    np.ones([4,3])
    

    3.单位矩阵

    np.eye(3, dtype=int)
    

    4.空矩阵

    np.empty(10)
    #空矩阵里面的值是没有意义的

    5.对角矩阵

    np.diag([1, 5, 300, 444, 44, 666, 77])
    

    6.设定具体的值

    np.full((3, 5),3.14 )
    

    7.设置空值

    f=np.nan 
    

    8.设置无穷大

    np.inf
    

    9.随机数组

    np.random.randint(1, 10, (3, 6)) #随机整数数组

    np.random.rand(3,3)#生成0-1之间的随机数组
    

      

    10.正态分布

    #标准正态分布
    np.random.randn(4, 5 ) 

     # 均值, 标准差, 形状
    np.random.normal(4, 2, (10, 3)) 
    
    # 生成t分布, df 自由度  
    np.random.standard_t(10 , (3,3))
    
    # 卡方分布
    np.random.chisquare(10 , (3,4))
    
    
    # F分布 , 分子自由度, 分母自由度
    np.random.f(2,3, (3,4))
    

    11.随机数种子

    # 随机数种子
    np.random.seed(666)
    np.random.randint(0,10, (3,3))
    

    12.创建一个线性序列的数组

    arange([start,] stop[, step,])
    
    特点: 可以设置开始位置,终止位置和步长,但产生数字的数量不方便控制
    
    np.arange(0, 20, 4)
    
    
    
    np.linspace(开始位置, 终止位置, 产生数量)
    
    特点: 可以设置开始位置和终止位置以及产生数量,但不方便控制步长
    
    # 从 0 - 10  个数 28个
    np.linspace(0 , 10 , 28)
    

     arange是左闭右开,linspace闭区间。

    五、数组的索引和切片

    Python 中原生的数组就支持使用方括号([])进行索引和切片操作,Numpy 也同样具有这个强大的特性。

    #单个元素的索引
    x = np.arange(10) x[2]

    与Python原生的列表、元组不同的是,Numpy数组支持多维数组的多维索引。每一个逗号, 代表索引的一个维度。

    #二维数组的索引
    x2[0::2,0::3]
    #修改某一个元素
    x1[1] = 3.1415926  # 类型会自动转换
    

    可以使用切片和步长来截取不同长度的数组,使用方式与Python原生的对列表和元组的方式相同。语法和之前学过的列表的切片是一样的。

    x[start:stop:step]

    注意:关于数组切片有一点很重要也非常有用,那就是数组切片返回的是 数组数据的视图,而不是数值数据的副本。这一点也是 NumPy 数 组切片和 Python 列表切片的不同之处:在 Python 列表中,切片是 值的副本。

    六、复制和视图

    完全不复制

    视图(浅复制)

    完全复制(深复制)

    视图:不同的数组对象可以共享相同的数据。view方法创建一个新数组对象,该对象看到相同的数据。与前一种情况不同,新数组的维数更改不会更改原始数据的维数,但是新数组数据更改后,也会影响原始数据

     重点:矢量化运算  , 生成随机数, 索引和切片, 浅复制(视图) 

     
     
  • 相关阅读:
    670. Maximum Swap
    653. Two Sum IV
    639. Decode Ways II
    636. Exclusive Time of Functions
    621. Task Scheduler
    572. Subtree of Another Tree
    554. Brick Wall
    543. Diameter of Binary Tree
    535. Encode and Decode TinyURL
    博客园自定义背景图片
  • 原文地址:https://www.cnblogs.com/BC10/p/11674847.html
Copyright © 2011-2022 走看看