(学习笔记) Numpy(numpy.array())

881 阅读9分钟
 Numpy(numpy.array())
  • 基础
    • 通常习惯于在使用numpy的时候起别名"np" : import numpy as np
    • 使用numpy的意义
      • why not python's 'List'
        • 对元素类型不做限定,灵活
        • 效率很低
      • why not python's 'array'
        • 限定元素类型,不灵活
        • 效率高
        • 缺点:仅仅将存入的数据当作一个数组或者二维数组来看待,并没有将数据视作向量或者矩阵,相应地并不提供向量或矩阵运算。
      • 由此使用numpy.array进行矩阵或向量运算。
    • 只能存储一种数据类型
    • 如果将浮点数存入整型numpy数组中,会自动进行截尾操作
    • 存在隐式数据类型转换
  • numpy数组和矩阵的创建
    • 基本的创建方法,略
    • 创建指定值的数组或矩阵
      • np.zeros(shape,dtype)
        • np.zeros(shape) 创建大小为shape,数据类型默认的零数组
        • np.zeros(shape,dtype=int) 创建大小为shape,数据类型指定为int的零数组
        • np.zeros((m,n)) 创建m行n列,数据类型默认的零矩阵
        • 图例:
      • np.zeros(shape,dtype)
        • 创建同上.....的1矩阵
      • np.full(shape,fill_value)
        • 创建指定参数值[fill_value]矩阵,数据类型与fill_value一致
        • 当参数名写出来的时候,就可以调整参数的顺序【强烈建议注明,方便后期维护】

      • np.arange(a,b,l)
        • 创建从a开始到b结束(不包含b),间距(步长为l)的数组
      • np.linspace(a,b,n)
        • 创建从a开始到b结束(包含b),个数为n的数组
  • 随机数 np.random模块
    • np.random.randint(a,b)
      • np.random.randint(a,b) 生成a到b之间的一个随机数
      • np.random.randint(a,b,n) 生成由a到b之间的数组成的大小为n的随机数向量
      • np.random.randint(a,b,size=(m,n)) 生成由a到b之间的数组成的大小为m行n列的随机数矩阵
    • 随机数种子
      • 意义:由于每一次随机数生成的结果都是不同的,如果在实验调试的过程中,需要重复某一个步骤,由于随机数不一致就会导致无法重现这个步骤。随机数种子可以保证在使用同一个随机数种子的情况下每一次生成的随机数都是一致的。
      • 方法:np.random.seed( n )
    • 生成随机浮点数
      • np.random.random( size ) :生成指定大小的随机浮点数,默认大小为1个
      • 生成符合正态分布的随机浮点数: np.random.normal( a , b ,size) 均值为a 方差为b 大小为size
    • 方法的文档查询方法:
      • 1、去numpy官网
      • 2、在notebook中:在方法或者模块后面加一个“?”,运行 后就会显示该方法者模块的文档。 或者使用 help(方法名/模块名)
  • numpy数组和矩阵的基本操作
    • numpy.array的基本操作
    • 基本属性:
      • ndim :表示数组维度的维数
      • shape:表示元组的维度大小(形状)
      • size:表示元组的元素个数
    • 数据访问:
      • 对于一维数组,直接以下标方式进行访问,eg: X[1]
      • 对于多维数组,X[m,n] 表示访问第m行n列个元素
      • 切片【!!!】
        • 一维数组的访问:
          • x[a:b]:访问x元组中 从a开始到b(不包含b)的元素
          • x[:b]:访问x元组中 从头开始到b(不包含b)的元素
          • x[a:]:访问x元组中 从a开始到元组最后一个元素
          • x[::l]:l代表步长,代表从头开始到结尾以l为步长对元组进行访问。
        • 多维数组的访问:【理解切片操作:x[... , ...] 中间的“,”前的参数控制对矩阵的行元素的访问,后面的参数控制对矩阵的列元素的访问】
          • x[:m,:n]:访问元组的前m行,前n列
          • x[:m, ::l]:访问元组的前m行在列数上以l为步长(间隔)的元素
          • x[::-1,::-1]:矩阵反转(从矩阵的最后一行开始倒着访问矩阵的元素)
          • 取一行:x[0 , : ]
          • 取一列:x[ : ,0]
        • 若对一个父矩阵取子矩阵,若改变父/子矩阵有一方的元素值改变,另一方将同步发生变化。如果想避免这种同步更改效应,需要在对父矩阵取子矩阵时使用copy()方法。
      • Reshape方法
        • x.reshape(m,n) , 取一个元组维度变换后的副本。如下:
  • 数据和矩阵的合并与分割
    • 合并操作
      • np.concatenate([x,y,...],axis)
        • 合并向量:将[]中的向量合并在一起
        • 合并矩阵:将[]中的向量合并在一起,axis参数默认为0代表行维度合并,1代表列维度合并
        • 将向量和矩阵合并在一起:需要将向量(元组)先使用reshape()方法转化为一维矩阵,然后再与后者进行合并。
      • np.vstack():上述方法第三条的高效版,无需reshape()方法的转换就可以将向量(元组)与矩阵进行合并。【此方法为垂直方向合并】
      • np.hstack():将向量矩阵再水平方向上进行合并
    • 分割操作
      • np.split(x,[分割点],axis) :x为要分割的元组或者矩阵,[]内为分割点,axis指定分割维度 默认为0(行维度) 1(列维度)
        • 分割元组的示例:
        • 分割矩阵的示例:
      • np.vsplit : 垂直方向分割 道理同合并
      • np.hsplit:水平方向分割 道理同合并
  • 矩阵运算(运行速度相较于python的list语法非常快)
    • 对矩阵的运算
      • 与常数可以直接加减乘除、乘方、求余等(对矩阵的每个元素做加减乘除以及乘方、求余等操作)
      • 各种方法详见文档
    • 矩阵和矩阵之间的运算
      • 加减运算:和实际数学运算一致
      • 乘除运算:是两个矩阵之间对应元素进行乘除操作(与实际的数学运算不一致,而且矩阵之间在数学的定义里不存在除法)
      • 进行数学意义上的乘法操作:A.dot(B) [A、B为两个矩阵]
        在数学定义中,矩阵的乘法如下:
      • 进行数学意义上的转置操作:A.T
    • 向量和矩阵的运算
      • 向量会和矩阵的每一行对应元素进行加法运算(在数学上并不存在)
      • np.tile(v,(m,n)) 将向量v,在行上进行m次堆叠,在列方向上进行n次堆叠。
      • 向量和矩阵直接进行乘法:向量会和矩阵的每一行进行对应元素相乘
      • 向量和矩阵进行数学意义上矩阵之间的乘法:dot()方法 【dot()方法会直接根据运算规则对向量进行自动的行列转换】
    • 矩阵的逆
      • 数学性质:一个矩阵和其逆矩阵进行左乘或者右乘,结果都是单位矩阵。【因此,只有方阵才有逆矩阵】
      • np.linalg.inv()方法
      • 如果不是仿真,可以求其伪逆矩阵。方法是np.linalg.pinv()方法,原矩阵乘伪逆矩阵的结果也是一个单位矩阵。
  • 聚合运算
    • 对向量的聚合操作
      • 求一组数据的和: np.sum
      • 求一组数据中的最小(大)值: np.min()/max()
    • 对矩阵的聚合操作
      • 求整个矩阵数据的和:np.sum
      • 求矩阵每一列的值:np.sum(A , axis = 0) 【A指目标矩阵,axis = 0 指的是按照x轴的方向】
      • 求矩阵每一行的值:np.sum(A , axis = 1) 【A指目标矩阵,axis = 1 指的是按照y轴的方向】
      • 求矩阵所有元素的乘积:np.prod(A)
      • 求矩阵所有元素的中位数:np.median(A)
      • 求矩阵所有元素的平均值:np.mean(A)
        • 平均值主要缺点是易受极端值的影响,这里的极端值是指偏大或偏小数,当出现偏大数时,平均数将会被抬高,当出现偏小数时,平均数会降低。
        • 中位数:与数据的排列位置有关,某些数据的变动对它没有影响;它是一组数据中间位置上的代表值,不受数据极端值的影响。
      • 求矩阵所有数据的百分位:np.percenttile(A,q) 参数q用于规定选定数据占总数据的百分比。
        • 当q=50%时,返回值就是数据的中位数,当等于100%的时候,返回值就是数据的最大值。
      • 求矩阵所有数据的方差 np.var()
        • 方差: 统计中的方差(样本方差)是每个样本值与全体样本值的平均数之差的平方值的平均数。 用来计算每一个变量(观察值)与总体均数之间的差异。
        • 方差计算公式:
          为总体方差, 为变量, 为总体均值, 为总体例数。】
      • 求矩阵所有数据的标准差 np.std()
        • 标准差:
          标准差也被称为标准偏差,或者实验标准差,公式如下所示:标准差=方差的算术平方根。在概率统计中最常使用作为统计分布程度上的测量。
        • 例,两组数的集合{0,5,9,14}和{5,6,8,9}其平均值都是7,但第二个集合具有较小的标准差。
      • 方差和标准差是测算离散趋势最重要、最常用的指标。标准差与方差不同的是,标准差和变量的计算单位相同,比方差清楚,因此很多时候我们分析的时候更多的使用的是标准差。
  • 索引运算
    • 索引:某个值的位置(索引),运算标志:arg
      • 例,如图。
    • 排序和使用索引
      • 向量排序
        • np.sort(x),x为要排序的向量对象,返回值为一个排好序的新向量对象,而不是x本身。
        • x.sort( ),x为要排序的向量对象,直接对向量x进行排序。
        • 向量的索引排序:np.argsort( x ),返回值是每个向量的索引
      • 矩阵排序
        • np.sort(x,axis),x为要排序的矩阵对象,不指定参数axis的值时候,默认沿着列的方向(axis = 1)对每一行进行排序。指定axis = 0,将沿着行的方向对每一列进行排序。
        • 矩阵的索引排序:np.argsort( x,axis ) ,返回值是每个元素在行/列的索引值。
    • Fancy indexing (索引数组)
      • 对于数组(向量)的用法
        • 一维索引数组,例

x = [0,1,2,3,4,5,6,7]ind = [1,2,3] **定义一个索引数组x[ind] **将输出数组x中索引为1,2,3的元素

  • 二维索引数组 :将根据指定的索引矩阵返回一个矩阵

ind =np.array([[0,2],[1,3]])x[ind] **根据索引矩阵将根据指定的索引矩阵返回一个矩阵

    • 对于矩阵的用法:
  • 比较
    • 简单比较,如图,
    • np.sum( 比较运算式)
      返回样本中使得计算式为真的元素的个数。
    • np.any( ):
      返回值为布尔值,判断样本中是否存在元素符合参数条件
    • np.all( ):
      返回值为布尔值,判断样本中是否所有元素符合参数条件
    • “非”运算符 “~”
    • 布尔数组作为索引数组:
[]备注:padas、机器学习、numpy的关系:机器学习中的scikit-learn库通常接受numpy矩阵,所以通常由pandas对数据进行预处理,再转化为numpy矩阵再喂给机器学习算法。