2.科学计算库之Numpy

作者: 瓦雷 | 来源:发表于2017-12-25 22:14 被阅读55次

    一、什么是Numpy

    numpy主要用来处理同类型数据的多维数组,里面所有的元素必须是同一类型, 如果不是的话,会自动的向下进行转换。在numPy中维度(dimensions)叫做轴(axes),轴的个数叫做秩(rank)。

    二、使用

    1.基本操作
    1.导入numpy库
    import numpy as np
    
    2.将list转为ndarray类型
    array = np.array([1,2,3,4,5])
    print (type(array))
    输出为:<class 'numpy.ndarray'>
    
    3.使用array运算+1
    array2 = array + 1
    print(array2)
    输出:[2 3 4 5 6] 所有元素都会做一遍+1运算
    
    4.取值:array2[0]
    
    5.数组各维的大小tuple类型,对一个n行m列的矩阵来说, shape 为 (n,m)
    array2.shape()
    输出:(5,)
    
    6.每个元素占用的字节数
    array.itemsize 
    
    7.每个元素的类型,可以是 numpy.int32, numpy.int16, and numpy.float64 等
    array.dtype疑问为什么int类型有时候输出32有时候输出64
    
    8.函数生成的数组的元素按照等比数列排布,类似于 range函数
    arange(10,30,5)
    输出:array([10, 15, 20, 25])  
    
    9.array.size: 统计所有元素的个数
    10.array.ndim: 数组的维数,也称为rank
    11.array.fill(0): 填充矩阵中的值,会将矩阵中的所有值都置为0
    12.array.data: 指向数据内存
    13.索引与切片:跟Python都是一样的 都是从0开始的
    
    
    2.数值计算
    原始数据:
    import numpy as np
    tang_array = np.array([[1,2,3],[4,5,6]])
    tang_array
    输出:
    array([[1, 2, 3],
           [4, 5, 6]])
    
    1.求和
    *所有元素求个
    np.sum(tang_array)
    
    *指定要进行的操作是沿着什么轴(维度)
      #横向求和
      np.sum(tang_array,axis=0)
      输出:array([5, 7, 9])
    
      #纵向
      np.sum(tang_array,axis=1)
      输出:array([ 6, 15])
    
    2.求积
    *所有元素求积
    tang_array.prod()
    
    *指定要进行的操作是沿着什么轴(维度)
      #纵向求积
     tang_array.prod(axis = 0)
      输出:array([ 4, 10, 18])
    
      #横向
      tang_array.prod(axis = 1)
      输出:array([  6, 120])
    
    3.求最小值,使用min()函数
    
    4.求矩阵中所有的元素最小值的索引
      array.argmin() 输出:0 该位置就是所有矩阵元素中的最小值索引
    
      横向(x轴)位置最小索引
      array.argmin(axis=0)
    
      纵向(y轴)位置最小索引
      array.argmin(axis=1)
    
    5.求矩阵中所有的元素的平均值 
      array.mean()
    
      横向(x轴)位置平均值
      array.mean(axis=0)
    
      纵向(y轴)位置平均值
      array.mean(axis=1)
    
    6.方差
    array.var()
    array.clip(2,4):将小于2的值都变成2,大于4的值都变成4
    array.round():四舍五入
    array.round(decimals=1):指定精度,小数点后几位进行四舍五入
    
    7.标准差
    array.std()
    array.std(axis = 1)
    array.std(axis = 0)
    
    3、排序
    1.np.sort(array):默认排序axis = 1
    指定排序方向:np.sort(tang_array,axis = 0)
    
    2.np.argsort(array):进行排序之后每个元素应该所处的位置的索引值
    
    3.需求:将3个值有序的插入到list列表中
    np.linspace(0,10,10):0-10之间取出相等间隔的10个值
    tang_array = np.linspace(0,10,10)
    输出:array([  0.        ,   1.11111111,   2.22222222,   3.33333333,
             4.44444444,   5.55555556,   6.66666667,   7.77777778,
             8.88888889,  10.        ])
    
    values = np.array([2.5,6.5,9.5])
    
    np.searchsorted(tang_array,values):得到应该插入的索引位置
    输出:array([3, 6, 9])
    疑问:该怎么插入呢???
    
    4.需求:将矩阵中第一列数据降序排序,第三列一列升序
    tang_array = np.array(
    [[1,0,6],
     [1,7,0],
     [2,3,1],
     [2,4,0]]
    )
    得出排序后的索引值:
    index = np.lexsort([-1*tang_array[:,0],tang_array[:,2]])
    输出:array([3, 1, 2, 0])
    
    tang_array = tang_array[index]
    输出:
    [[2, 4, 0],
    [1, 7, 0],
    [2, 3, 1],
    [1, 0, 6]]
    
    
    4、数组形状操作
    import numpy as np
    tang_array = np.arange(10)
    tang_array
    输出:array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
    tang_array.shape 输出:(10,)
    
    1.tang_array.shape = 2,5:改变数组的形状变成2行5列
    输出:array([[0, 1, 2, 3, 4],
           [5, 6, 7, 8, 9]])
    或者:tang_array.reshape(1,10)
    
    2.为数据新加一列
    tang_array = tang_array[:,np.newaxis]
    tang_array.shape
    输出:(10,1)
    
    tang_array = tang_array[:,np.newaxis,np.newaxis]
    输出:(10, 1, 1, 1)
    
    3.如何去除以上多余的列呢,像1这种没有实际意义的
    tang_array = tang_array.squeeze()
    tang_array.shape
    输出(10,)
    
    4.转制:tang_array.transpose() 行列对调 或者tang_array.T
    
    5.数组的连接
    a = np.array([[123,456,678],[3214,456,134]])
    b = np.array([[1235,3124,432],[43,13,134]])
    c = np.concatenate((a,b))⚠️注意:需要将a,b用扩号包起来,类似元组
    输出:array([[ 123,  456,  678],
           [3214,  456,  134],
           [1235, 3124,  432],
           [  43,   13,  134]])
    
    指定连接:c = np.concatenate((a,b),axis = 1)
    输出:array([[ 123,  456,  678, 1235, 3124,  432],
           [3214,  456,  134,   43,   13,  134]])
    
    np.vstack((a,b)) = np.concatenate((a,b))默认axis=0
    np.hstack((a,b)) = np.concatenate((a,b),axis = 1)
    
    6.对数组进行拉平操作,多行变成一行
    a.flatten()
    输出:array([ 123,  456,  678, 3214,  456,  134])
    或者使用a.ravel()
    
    5、数组生成
    1.np.array([1,2,3])
    
    2.np.arange(10):构造从0开始数10个整数,所以是0-9
    
    3.np.arange(2,20,2):构造2-20之间没间隔2构造一个数值,不包括20,取前不取后
    输出:array([ 2,  4,  6,  8, 10, 12, 14, 16, 18])
    指定类型:np.arange(2,20,2,dtype=np.float32)
    
    4.np.linspace(0,10,5):构造0-10之间等差的5个值,会包含前尾
    输出:array([  0. ,   2.5,   5. ,   7.5,  10. ])
    
    5.np.logspace(0,1,5):默认是10为底的
    输出:array([  1.        ,   1.77827941,   3.16227766,   5.62341325,  10.        ])
    
    6.构造立体网格
    x = np.linspace(-20,-10,5,dtype=np.int32)
    y = np.linspace(10,20,5,dtype=np.int32)
    
    x,y= np.meshgrid(x,y)
    
    输出x:
    array([[-20, -17, -15, -12, -10],
           [-20, -17, -15, -12, -10],
           [-20, -17, -15, -12, -10],
           [-20, -17, -15, -12, -10],
           [-20, -17, -15, -12, -10]], dtype=int32)
    
    输出y:
    array([[10, 10, 10, 10, 10],
           [12, 12, 12, 12, 12],
           [15, 15, 15, 15, 15],
           [17, 17, 17, 17, 17],
           [20, 20, 20, 20, 20]], dtype=int32)
    
    7.横向量
    np.r_[0:10:2]
    输出:array([0, 2, 4, 6, 8])
    
    8.列向量
    np.c_[0:10:2]
    输出:
    array([[0],
           [2],
           [4],
           [6],
           [8]])
    
    
    6、常用生成函数
    1.构造值为0的数组:np.zeros(3)
    输出:array([ 0.,  0.,  0.])
    np.zeros((3,3))
    输出:
    array([[ 0.,  0.,  0.],
           [ 0.,  0.,  0.],
           [ 0.,  0.,  0.]])
    
    2.构造值为1的数组:np.ones(1)
    
    3.先构造一个空的格式然后填充值
    a = np.empty(6)
    a.fill(1)
    
    4.构造一个相同的矩阵格式:zeros_like或者ones_like
    tang_array = np.array([1,2,3,4])
    np.zeros_like(tang_array)
    输出:array([0, 0, 0, 0])
    
    np.ones_like(tang_array)
    输出:array([1, 1, 1, 1])
    
    5.单位矩阵:只有对角线为1,其他都为0,一个n*n的矩阵
    np.identity(5)
    输出:
    array([[ 1.,  0.,  0.,  0.,  0.],
           [ 0.,  1.,  0.,  0.,  0.],
           [ 0.,  0.,  1.,  0.,  0.],
           [ 0.,  0.,  0.,  1.,  0.],
           [ 0.,  0.,  0.,  0.,  1.]])
    
    7、运算
    import numpy as np
    x = np.array([5,5])
    y = np.array([3,2])
    
    1.np.multiply(x,y):对应位置做乘法运算
    输出:array([15, 10])
    
    2、np.dot(x,y):对应位置做乘法运算然后进行想加
    
    3.判断
    y = np.array([0,1,1,4])
    x = np.array([1,1,1,2])
    x == y
    输出:array([False,  True,  True, False], dtype=bool)
    
    与:对应位置比较,如果都为非0则为True,0是False ,1为True
    np.logical_and(x,y)
    输出:array([False,  True,  True,  True], dtype=bool)
    
    或:np.logical_or(x,y)
    输出:array([ True,  True,  True,  True], dtype=bool)
    
    8、随机模块
    1.np.random.rand():输出一个随机的0-1的浮点型随机数
    或者np.random.random_sample()这种用的少
    
    2.np.random.rand(3,2):指定为3行2列的矩阵维度
    输出:
    array([[ 0.16911943,  0.29939508],
           [ 0.72186879,  0.25800002],
           [ 0.01317978,  0.95518917]])
    
    3.np.random.randint(10,size = (5,4)):输出一个0-10(左闭右开),矩阵维度为3行2列
    输出:
    array([[6, 5, 8, 6],
           [0, 4, 8, 0],
           [9, 8, 6, 0],
           [5, 0, 1, 1],
           [2, 0, 6, 4]])
    
    4.np.random.randint(0,10,3):输出一个0-10区间的3个整型随机数
    输出:array([5, 8, 9])
    
    5.高斯分布
    mu, sigma = 0,0.1
    np.random.normal(mu,sigma,10)
    输出:
    array([-0.06, -0.11, -0.05,  0.12, -0.11, -0.05,  0.09,  0.03, -0.06,  0.03])
    
    6.洗牌:将初始化的数据进行随机打乱
    tang_array = np.arange(10)
    输出:array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
    
    np.random.shuffle(tang_array)
    
    输出:array([6, 2, 5, 7, 4, 3, 1, 0, 8, 9])
    
    7.随机的种子:指定一种随机的格式
    np.random.seed(1):参数随便定义
    mu, sigma = 0,0.1
    np.random.normal(mu,sigma,10)
    输出:array([-0.17,  0.03,  0.12, -0.03,  0.1 ,  0.05,  0.02, -0.11, -0.02,  0.03])
    
    ⚠️:每次执行随机的操作都会输出同样的结果,也就是第一次随机产生的结果
    
    9、文件读写
    1.不使用numpy
    文件中写入数据
    %%writefile tang.txt
    1 2 3 4 5 6
    2 3 5 8 7 9
    
    读取:
    data = []
    with open('tang.txt') as f:
        for line in f.readlines():
            fileds = line.split()
            cur_data = [int(x) for x in fileds]
            data.append(cur_data)
    data = np.array(data)
    data
    输出:
    array([[1, 2, 3, 4, 5, 6],
           [2, 3, 5, 8, 7, 9]])
    
    2.使用numpy
      1> data = np.loadtxt('tang.txt'):默认情况下是按照空格进行分割的
    
         如果数据不是按照空格进行分割的情况下应该如下,假如以,分割
    
         data = np.loadtxt('tang2.txt',delimiter = ',')
    
      2> 如果数据如下,表头为字符串类型
         %%writefile tang4.txt
         e,r,t,y,u,i
         1,2,3,4,5,6
         但是又不想读取第一行的数据,可以使用skiprows去除第一行
         data = np.loadtxt('tang.txt',delimiter = ',',skiprows=1)
    
    3.usecols = (0,1,4) :指定使用哪几列
    
    4.使用numpy写入数据
    tang_array = np.array([[1,2,3],[4,5,6]])
    np.savetxt('tang4.txt',tang_array)
    np.savetxt('tang4.txt',tang_array,fmt='%d'):指定写入数据类型为整型
    np.savetxt('tang4.txt',tang_array,fmt='%d',delimiter = ','): 指定写入类型和分割符
    np.savetxt('tang4.txt',tang_array,fmt='%.2f',delimiter = ','): 指定浮点的精度
    
    5.读写array结构
    
    1>读写单个array
    
      tang_array = np.array([[1,2,3],[4,5,6]])
      np.save('tang_array.npy',tang_array)
      tang = np.load('tang_array.npy')
      输出:
      array([[1, 2, 3],
           [4, 5, 6]])
    
    2>读写多个arrar
    
      tang_array2 = np.arange(10)
    
      ⚠️是savez函数和npz文件后缀,其实是将两个npy文件压缩成了一个npz文件,可以解压出来查看
      #以key value 键值对的形式存储
      np.savez('tang.npz',a=tang_array,b=tang_array2)
      data = np.load('tang.npz')  
    
      #查看所有key
      data.keys()
      #查看所有value
      data.values()
    
      #根据key值查找array的数据
      data['a']
      输出: array([[1, 2, 3],
                   [4, 5, 6]])
      data['b']
      输出:array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
    

    相关文章

      网友评论

        本文标题:2.科学计算库之Numpy

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