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方法创建一个新数组对象,该对象看到相同的数据。与前一种情况不同,新数组的维数更改不会更改原始数据的维数,但是新数组数据更改后,也会影响原始数据

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

     
     
  • 相关阅读:
    c# base knowledge
    Asp.net life cycle introduction
    Build a excel which contains downlist.
    using Assembly to create object
    Build a endtoend log to record system performance.
    转帖 饱含人生哲理的真情嘱咐
    Using nunit in website and class project.
    updatepanel summary
    我的项目 系统性能优化
    service数据改变时发广播给前端activity供显示
  • 原文地址:https://www.cnblogs.com/BC10/p/11674847.html
Copyright © 2011-2022 走看看