Numpy入门

作者: 惑也 | 来源:发表于2018-11-10 12:34 被阅读4次

    第1章 Numpy数组对象


    1. Numpy中的多维数组称为ndarray,是Numpy中最常见的数组对象
    2. ndarray对象包括:1)数据本身;2)描述数据的元数据
    3. Numpy数组的优势
    • 由相同种类的元素组成,即数组中的数据项的类型一致;
    • 能够运用向量化运算来处理整个数组,速度较快;
    • 使用了优化过的C API,运算速度较快;

    第2章 创建ndarray数组


    1. 导入numpy库时通常简写为np,这也是Numpy官方倡导的写法
      import numpy as np

    2. 常见创建方法

    • 基于listtuple
      一维数组
      arr_list = np.array([1, 2, 3, 4]) 
      
      arr_list
      -- > array([1, 2, 3, 4])
      
      print(arr_list)
      [1 2 3 4]       一维数组用print输出的时候为 [1 2 3 4],与python的列表list有差异,没有“ , ”
      
      
      
      二维数组
      arr = np.array([[1, 2, 3], [4, 5, 6]])   创建二维数组时,子list外面还有一个”[  ]”,形式为“[ [list1],  [list2] ]”
      
      arr
      array([[1, 2, 3],
             [4, 5, 6]])
      
      print(arr)
      [[1 2 3]
       [4 5 6]]
      
    • 基于np.arange()
      一维数组
      arr1 = np.arange(5) 
      print(arr1)
      [0 1 2 3 4]
      
      二维数组
      arr2 = np.array([np.arange(3), np.arange(4)])
      print(arr2)
      [array([0, 1, 2]) array([0, 1, 2, 3])]
      
    • 基于np.arange.reshape()
      三维数组
      arr3 = np.arange(24).reshape(3, 2, 4)    arange的长度要与ndarray的维度乘积相等,本例中 24 = 2X3X4
      print(arr3)
      [[[ 0  1  2  3]
        [ 4  5  6  7]]
      
       [[ 8  9 10 11]
        [12 13 14 15]]
      
       [[16 17 18 19]
        [20 21 22 23]]]
      
    • 其它方法:zeros()ones()full()eye()random.random()random.randint()random.choice()
      创建元素均为0的数组
      np.zeros((2, 3))
      array([[ 0.,  0.,  0.],
             [ 0.,  0.,  0.]])
      
      创建元素均为1的数组
      np.ones((2, 4))
      array([[ 1.,  1.,  1.,  1.],
             [ 1.,  1.,  1.,  1.]])
      
      创建元素均为指定值的数据:可以实现zeros()和ones()的功能
      np.full((2, 3), 100)
      array([[100, 100, 100],
             [100, 100, 100]])
      
      创建单位数组:左上角到右下角的折线上元素均为1
      np.eye(3)
      array([[ 1.,  0.,  0.],
             [ 0.,  1.,  0.],
             [ 0.,  0.,  1.]])
      
      创建0-1之间随机数字组成的数组
      np.random.random((3, 4))
      array([[ 0.44678911,  0.32013646,  0.79493587,  0.42866371],
             [ 0.93831111,  0.27245856,  0.85071582,  0.92076269],
             [ 0.43796771,  0.8913745 ,  0.56834941,  0.60390724]])
      
      创建指定整数范围之间随机数字组成的数组
      np.random.randint(10, 20, [2, 3])
      array([[11, 12, 19],
             [19, 12, 10]])
      
      创建指定列表中随机选择元素组成的数组
      np.random.choice(['yes', 'no', 'None'], [3, 4])
      array([['no', 'yes', 'yes', 'yes'],
             ['no', 'no', 'None', 'no'],
             ['None', 'yes', 'None', 'yes']],
             dtype='<U4')
      

    第3章 数据类型


    1. 数据类型
    数据类型 说明
    bool 布尔类型,True或Fasle,占用1比特
    inti 其长度取决于平台的整数,一般是int32或int64
    int8 字节长度的整数,取值:[-128, 127]
    int16 16位长度的整数,取值:[-32768, 32767]
    int32 32位长度的整数,取值:[-2^31, 2^31 - 1]
    int64 64位长度的整数,取值:[-2^63, 2^63 - 1]
    uint8 8位无符号整数,取值:[0, 255]
    uint16 16位无符号整数,取值:[0, 65535]
    uint32 32位无符号整数,取值:[0, 2^32 - 1]
    uint64 64位无符号整数,取值:[0, 2^64 - 1]
    float16 16位半精度浮点数:1位符号,5位指数,10位尾数
    float32 32位半精度浮点数:1位符号,8位指数,23位尾数
    float或float64 双精度浮点数:1位符号,11位指数,52位尾数
    complex64 复数类型,实部和虚部都是32位浮点数
    complex或complex128 复数类型,实部和虚部都是64位浮点数
    1. 数据类型转换示例
      np.int8(12.34)
      -- > 12
      
      np.float(Fasle)
      -- > 0.0
      
    2. 在创建ndarray数组时,可以指定数值类型
      np.arange(4, dtype=float)
      -- > array([ 0.,  1.,  2.,  3.])
      

    第4章 数组属性


    1. dtype:设置数组的数据类型
      np.arange(3, dtype='D')    'D'表示复数类型
      -- > np.arange(3, dtype='D')
      
    2. ndim:数组维度的数量
      a = np.array([[1, 2, 3], [4, 5, 6]])
      a.ndim
      -- > 2
      
    3. shape:数组对象的尺度,即矩阵的n行m列,是一个元组tuple
      a.shape
      -- > (2, 3)
      
    4. size:元素数量,即shapen*m的值
      a.size
      -- > 6
      
    5. itemsize:数组中单个元素所占用的字节数大小
      a.itemsize
      -- > 8
      
    6. nbytes:数组的字节数量,即size * itemsize
      a.nbytes
      -- > 48
      
    7. T:数组转置
      a.T
      array([[1, 4],
             [2, 5],
             [3, 6]])
      
    8. realimag:返回复数的实部和虚部
      a = np.array([1.2 + 2j, 2 + 3j])
      
      print(a)
      [ 1.2+2.j  2.0+3.j]
      
      a.real
      -- > array([ 1.2,  2. ])
      
      a.imag
      -- > array([ 2.,  3.])
      
    9. flat:返回一个numpy.flatiter可迭代对象,通过位置可以进行索引和赋值
      a = np.arange(6).reshape(2, 3)
      print(a)
      [[0 1 2]
       [3 4 5]]
      
      a.flat
      <numpy.flatiter at 0x7f937b910800>    一个可迭代的对象
      
      # 对a.flat进行遍历
      for i in a.flat:
          print(i, "a中第",i,"位是:", a.flat[i])
      
      0 a中第 0 位是: 0
      1 a中第 1 位是: 1
      2 a中第 2 位是: 2
      3 a中第 3 位是: 3
      4 a中第 4 位是: 4
      5 a中第 5 位是: 5
      
      a.flat[3] = 100  #赋值
      print(a)
      [[  0   1   2]
       [100   4   5]]
      

    第5章 数组索引


    1. 一维数组
      a = np.arange(7)
      a
      -- > array([0, 1, 2, 3, 4, 5, 6])
      
      a[:6:2]    #与python的list索引类似
      array([0, 2, 4])
      
    2. 二维数组:先指定行的索引,再指定列的索引
      a = np.arange(24).reshape(4, 6)
      a
      array([[ 0,  1,  2,  3,  4,  5],
             [ 6,  7,  8,  9, 10, 11],
             [12, 13, 14, 15, 16, 17],
             [18, 19, 20, 21, 22, 23]])
      
      a[1:3, 2:4]
      array([[ 8,  9],
             [14, 15]])
      
    3. 常用操作:数据筛选元素运算
      筛选大于15小于20的元素
      a[(a > 15) & (a < 20)]
      array([16, 17, 18, 19])
      
      对数组a的第2列加100
      a[0:, 1] += 100     等同于   a[np.arange(4), 1] += 100
      a
      array([[  0, 101,   2,   3,   4,   5],
             [  6, 107,   8,   9,  10,  11],
             [ 12, 113,  14,  15,  16,  17],
             [ 18, 119,  20,  21,  22,  23]])
      

    第6章 数组形状转换


    1. 行列转换:reshape(n, m)resize(n, m)
      a = np.arange(12).reshape(3, 4)
      a
      array([[ 0,  1,  2,  3],
             [ 4,  5,  6,  7],
             [ 8,  9, 10, 11]])
      
      reshape()不会修改原数组,返回一个修改后的新数组对象
      a.reshape(4, 3)
      array([[ 0,  1,  2],
             [ 3,  4,  5],
             [ 6,  7,  8],
             [ 9, 10, 11]])
      
      resize()会对原数组进行修改,返回None
      a.resize(2, 6)
      a
      array([[ 0,  1,  2,  3,  4,  5],
             [ 6,  7,  8,  9, 10, 11]])
      
    2. 设置数组形状:shape()
      a.shape = (3, 4)
      a
      array([[ 0,  1,  2,  3],
             [ 4,  5,  6,  7],
             [ 8,  9, 10, 11]])
      
    3. 多维转一维:ravel()flatten()
      a.ravel()   
      array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])
      
      a.flatten()
      array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])
      
      区别:通过该方式对数组赋值时,ravel()返回的是view,会改变原数组,flatten()会生成新对象,原数组不变。
      a.ravel()[3] = 100
      a
      array([[  0,   1,   2, 100],      原数组的第3位数据已变成100
             [  4,   5,   6,   7],
             [  8,   9,  10,  11]])
      
      
      a.flatten()[3] = 1000
      a
      array([[  0,   1,   2, 100],      原数组的第3位数据 未 变成 1000
             [  4,   5,   6,   7],
             [  8,   9,  10,  11]])
      
    4. 转置:transpose()
      a.transpose()      #作用同于T属性
      array([[  0,   4,   8],
             [  1,   5,   9],
             [  2,   6,  10],
             [100,   7,  11]])
      

    第7章 数组堆叠


    1. 水平堆叠:hstack()columns_stack()
      a = np.arange(6).reshape(2,3)
      a
      array([[0, 1, 2],
             [3, 4, 5]])
      
      np.hstack((a, a*100))
      array([[  0,   1,   2,   0, 100, 200],
             [  3,   4,   5, 300, 400, 500]])
      
      np.column_stack((a, a*0))
      array([[0, 1, 2, 0, 0, 0],
             [3, 4, 5, 0, 0, 0]])
      
    2. 垂直堆叠:vstack()row_stack()
      np.vstack((a, a*100))
      array([[  0,   1,   2],
             [  3,   4,   5],
             [  0, 100, 200],
             [300, 400, 500]])
      
      np.row_stack((a, a*0))
      array([[0, 1, 2],
             [3, 4, 5],
             [0, 0, 0],
             [0, 0, 0]])
      
    3. 指定方向叠加:concatenate()
      np.concatenate((a, a*-1), axis=0)
      array([[ 0,  1,  2],
             [ 3,  4,  5],
             [ 0, -1, -2],
             [-3, -4, -5]])
      
      np.concatenate((a, a*-1), axis=1)
      array([[ 0,  1,  2,  0, -1, -2],
             [ 3,  4,  5, -3, -4, -5]])
      
    4. 深度叠加:dstack()
      # 叠加的2个数组,必须有相同的行列数
      a = np.arange(9).reshape(3, 3)
      a
      array([[0, 1, 2],
             [3, 4, 5],
             [6, 7, 8]])
      
      b = a * -1
      b 
      array([[ 0, -1, -2],
             [-3, -4, -5],
             [-6, -7, -8]])
      
      np.dstack((a, b))
      array([[[ 0,  0],
              [ 1, -1],
              [ 2, -2]],
      
             [[ 3, -3],
              [ 4, -4],
              [ 5, -5]],
      
             [[ 6, -6],
              [ 7, -7],
              [ 8, -8]]])
      

    第8章 数组拆分


    1. 横行拆分:hsplit()
      拆分的份数必须是数组列数的约数
      a = np.arange(12).reshape(2, 6)
      a
      array([[ 0,  1,  2,  3,  4,  5],
             [ 6,  7,  8,  9, 10, 11]])
      
      np.hsplit(a, 3)
      [array([[0, 1],
              [6, 7]]), 
       array([[2, 3],
              [8, 9]]), 
       array([[ 4,  5],
              [10, 11]])]
      
    2. 纵向拆分:vsplit()
      拆分的份数必须是数组行数的约数
      b = np.arange(12).reshape(6, 2)
      b
      array([[ 0,  1],
             [ 2,  3],
             [ 4,  5],
             [ 6,  7],
             [ 8,  9],
             [10, 11]])
      
      np.vsplit(b, 2)
      [array([[0, 1],
              [2, 3],
              [4, 5]]), 
       array([[ 6,  7],
              [ 8,  9],
              [10, 11]])]
      
    3. 指定方向拆分:split()
      np.split(a, 2, axis=1)
      [array([[0, 1, 2],
              [6, 7, 8]]), 
       array([[ 3,  4,  5],
              [ 9, 10, 11]])]
      
      np.split(b, 3, axis=0)
      [array([[0, 1],
              [2, 3]]), 
       array([[4, 5],
              [6, 7]]), 
       array([[ 8,  9],
              [10, 11]])]
      
    4. 深度拆分:dsplit()
      print(a)
      array([[[  0,   0],
              [  1,  -1],
              [  2,  -2],
              [  3,  -3]],
      
             [[  4,  -4],
              [  5,  -5],
              [  6,  -6],
              [  7,  -7]],
      
             [[  8,  -8],
              [  9,  -9],
              [ 10, -10],
              [ 11, -11]]])
      
      np.dsplit(b, 2)
      [array([[[ 0],
               [ 1],
               [ 2],
               [ 3]],
      
              [[ 4],
               [ 5],
               [ 6],
               [ 7]],
      
              [[ 8],
               [ 9],
               [10],
               [11]]]), 
      
       array([[[  0],
               [ -1],
               [ -2],
               [ -3]],
      
              [[ -4],
               [ -5],
               [ -6],
               [ -7]],
      
              [[ -8],
               [ -9],
               [-10],
               [-11]]])]
      

    第9章 数组运算


    1. 数学四则运算:add()subtract()multiply()divide()
      a = np.array([[1, 2],[3, 4]])
      a
      array([[1, 2],
             [3, 4]])
      
      b = np.array([[9, 6], [3, 7]])
      b
      array([[9, 6],
             [3, 7]])
      
      加法
      a + b     等同于 np.add(a, b) 
      array([[10,  8],
             [ 6, 11]])
      
      减法
      a - b    等同于 np.subtract(a, b)
      array([[-8, -4],
             [ 0, -3]])
      
      乘法
      a * b    等同于 np.multiply(a, b)
      array([[ 9, 12],
             [ 9, 28]])
      
      除法
      a / b    等同于 np.divide(a, b) 
      array([[ 0.11111111,  0.33333333],
             [ 1.        ,  0.57142857]])
      
    2. 矩阵乘法:第1个数组的列数必须与第2个数组的行数相同
      a = np.array([[1, 2],[3, 4]])
      a
      array([[1, 2],
             [3, 4]])
      
      b = np.array([[1, 2, 3], [3, 4, 5]])
      b
      array([[1, 2, 3],
             [3, 4, 5]])
      
      np.dot(a, b)
      array([[ 7, 10, 13],
             [15, 22, 29]])
      
    3. 常用统计函数
      a = np.arange(12).reshape(3, 4)
      a
      array([[ 0,  1,  2,  3],
             [ 4,  5,  6,  7],
             [ 8,  9, 10, 11]])
      
      求(max - min)
      a.ptp(axis=0)
      array([8, 8, 8, 8])
      
      累加值
      a.cumsum(axis=1)
      array([[ 0,  1,  3,  6],
             [ 4,  9, 15, 22],
             [ 8, 17, 27, 38]])
      
      其它运算:开方
      np.sqrt(a) 
      array([[ 1.        ,  1.41421356],
             [ 1.73205081,  2.        ]])
      
      
    函数 说明
    len 返回个数
    np.sum() 返回求和
    np.mean() 返回均值
    np.max() 返回最大值
    np.min() 返回最小值
    np.ptp() 沿指定轴返回最大值减去最小值:即(max - min)
    np.std() 返回标准偏差
    np.var() 返回方差
    np.cumsum() 返回累加值
    np.cumprod() 返回累乘积值
    1. 数组广播
    • 当数组与一个标量进行数学运算(加减乘除)时,标量会根据数组的形状进行扩展,然后执行运算,这个扩展的过程称为广播(broadcasting)
      a = np.arange(12).reshape(3, 4)
      a
      array([[ 0,  1,  2,  3],
             [ 4,  5,  6,  7],
             [ 8,  9, 10, 11]])
      
      a + 10000
      array([[10000, 10001, 10002, 10003],
             [10004, 10005, 10006, 10007],
             [10008, 10009, 10010, 10011]])   
      
    • 数组与一维数组的运算也可以进行广播,前提是数组的列数与一维数组的元素个数相同
      b = np.array([2, 10, 4, 8])
      b
      array([ 2, 10,  4,  8])
      
      a + b
      array([[ 2, 11,  6, 11],
             [ 6, 15, 10, 15],
             [10, 19, 14, 19]])
      
      使用tile()函数也可以实现该运算:将b在纵轴上重复3次,即和数组a的行数相同,即可直接进行数学加运算
      a + np.tile(b, (3, 1))
      array([[ 2, 11,  6, 11],
             [ 6, 15, 10, 15],
             [10, 19, 14, 19]])
      

    第10章 数组函数


    1. 生成指定范围内的随机数值:uniform()
      np.random.uniform(50, 70)
      -- > 55.1791859753946
      
    2. 将数组作为一个元素,在指定方向上重复n次:tile()
      a = np.array([[1,10], [2, 200]]) 
      a
      array([[  1,  10],
             [  2, 200]])
      
      数组a,在纵轴上重复0次、在横轴上重复2次
      np.tile(a, (1, 3)) 
      array([[  1,  10,   1,  10,   1,  10],
             [  2, 200,   2, 200,   2, 200]])
      
    3. 数组元素在指定轴上(默认为横轴)排序的序号:argsort()
      a = np.array([[5, 3, 7, 1], [2, 1, 3, 9], [8, 5, 3, 6]])
      a
      array([[5, 3, 7, 1],
             [2, 1, 3, 9],
             [8, 5, 3, 6]])
      
      横轴排序
      array([[3, 1, 0, 2],
             [1, 0, 2, 3],
             [2, 1, 3, 0]])
      
      纵轴排序
      a.argsort(axis=1)   
      array([[3, 1, 0, 2],
             [1, 0, 2, 3],
             [2, 1, 3, 0]])
      
    4. 数组转成list:tolist()
      a = np.arange(12).reshape(3, 4)
      a
      array([[ 0,  1,  2,  3],
             [ 4,  5,  6,  7],
             [ 8,  9, 10, 11]])
      
      a.tolist()
      [[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]]
      
    5. 数组数据类型转换:astype()
      a.astype(float)
      array([[  0.,   1.,   2.,   3.],
             [  4.,   5.,   6.,   7.],
             [  8.,   9.,  10.,  11.]])
      

    相关文章

      网友评论

        本文标题:Numpy入门

        本文链接:https://www.haomeiwen.com/subject/izurxqtx.html