zoukankan      html  css  js  c++  java
  • numpy模块

    numpy模块

    计算速度快,提供了数组操作、数组运算、以及统计分布和简单的数学模型,用来存储和处理大型矩阵。

    创建矩阵(掌握)

    矩阵即numpy的ndarray对象,创建矩阵就是把一个列表传入np.arrray()方法。

    #创建一维的ndarray对象
    import numpy as np
    lis = [1,2,3]
    np.array(lis)
    print(arr,type(arr))
    
    [1 2 3] <class 'numpy.ndarray'>
    
    #创建二维的ndarray对象
    print(np.array([[1,2,3],[4,5,6]]))
    
    [[1 2 3]
     [4 5 6]]
    
    #创建三维的ndarray
    print(np.array([[[2.10025514,  0.12015895,  0.61720311],
            [ 0.30017032, -0.35224985, -1.1425182 ],
            [-0.34934272, -0.20889423,  0.58662319]],
    
           [[ 0.83898341,  0.93110208,  0.28558733],
            [ 0.88514116, -0.75439794,  1.25286816],
            [ 0.51292982, -0.29809284,  0.48851815]],
    
           [[-0.07557171,  1.13162939,  1.51981682],
            [ 2.18557541, -1.39649634, -1.44411381],
            [-0.50446586,  0.16003707,  0.87616892]]]))
    
    
    [[[ 2.10025514,  0.12015895,  0.61720311],
        [ 0.30017032, -0.35224985, -1.1425182 ],
        [-0.34934272, -0.20889423,  0.58662319]],
    
       [[ 0.83898341,  0.93110208,  0.28558733],
        [ 0.88514116, -0.75439794,  1.25286816],
        [ 0.51292982, -0.29809284,  0.48851815]],
    
       [[-0.07557171,  1.13162939,  1.51981682],
        [ 2.18557541, -1.39649634, -1.44411381],
        [-0.50446586,  0.16003707,  0.87616892]]]    
    

    获取矩阵的行列数

    arr = np.array([[1,2,3],[4,5,6]])
    print(arr)
    
    [[1,2,3]
     [4,5,6]]
    
    #获取矩阵的行和列构成的数组
    print(arr.shape)
    
    (2,3)
    
    #获取矩阵的行
    print(arr.shape[0])
    
    2
    
    #获取矩阵的列
    print(arr.shape[1])
    
    3
    

    切割矩阵

    切分矩阵类似于列表的切割,但是与列表不切割不同的是,矩阵的切割涉及到行和列的切割,但是两者的切割的方式都是从索引0开始,并且取头不取尾。

    arr = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])
    print(arr)
    
    [[1  2  3  4]
     [5  6  7  8]
     [9 10 11 12]]
    
    #取出第二行,第三列的元素,默认第一行参数为0
    print(arr[1,2]) 
    
    7
    
    
    #取第一行矩阵的元素
    print(arr[0,[0,1,2,3]])   
    
    [1 2 3 4]                
    
    
    #取出第一行矩阵的元素
    print(arr[0,:])
    
    [1 2 3 4]         
    
    
    #取出第一列矩阵的元素
    print(arr[:,0])   
    
    [1 5 9]
    
    
    #矩阵按运算符取元素的原理,即通过arr > 5生成一个布尔矩阵
    print(arr > 5)
    
    [[False False False False]
     [False  True  True  True]
     [ True  True  True  True]]
    
    
    #取大于5的元素,返回一个数组
    print(arr[arr > 5])
    
    [ 6  7  8  9 10 11 12]
    
    

    矩阵元素替换

    矩阵元素的替换,类似于列表元素的替换,并且矩阵也是一个可变类型的数据,即如果对矩阵进行替换操作,会修改原矩阵的元素,所以下面我们用.copy()方法举例矩阵元素的替换。

    arr = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])
    print(arr)
    
    [[ 1  2  3  4]
     [ 5  6  7  8]
     [ 9 10 11 12]]
    
    
    #替换6为0
    arr[1,1] = 0
    print(arr)
    
    [[ 1  2  3  4]
     [ 5  0  7  8]
     [ 9 10 11 12]]
    
    
    #取第一行的所有元素,并且让第一行的元素都为1
    arr[0,:] = 1
    print(arr)
    
    [[ 1  1  1  1]
     [ 5  6  7  8]
     [ 9 10 11 12]]
    
    
    # 取出大于5的元素,并且让大于5的元素都为2
    arr[arr>5] = 2
    print(arr)
    
    [[1 2 3 4]
     [5 2 2 2]
     [2 2 2 2]]
    
    

    矩阵的合并

    arr1 = np.array([[1,2],[3,4],[5,6]])
    print(arr1)
    
    [[1 2]
     [3 4]
     [5 6]]
    
    
    arr2 = np.array([[7,8],[9,10],[11,12]])
    print(arr2)
    
    [[ 7  8]
     [ 9 10]
     [11 12]]
    
    
    • vstack和hstack只能放一个参数,这个参数必须得是容器
    #合并两个矩阵的列,注意使用vatack()方法合并矩阵,矩阵应该有相同的列,其中vstack的v表示vertical垂直的
    print(np.vstack((arr1,arr2)))  
    
    [[ 1  2]
     [ 3  4]
     [ 5  6]
     [ 7  8]
     [ 9 10]
     [11 12]]
    
    
    #合并两个矩阵的行,注意使用hstack()方法合并矩阵,矩阵应该有相同的行,其中hastack的h表示horizontal水平的
    print(np.hstack((arr1,arr2)))
    
    [[ 1  2  7  8]
     [ 3  4  9 10]
     [ 5  6 11 12]]
    
    
    #合并两个矩阵的列   默认垂直
    print(np.concatenate((arr1,arr2)))
    
    [[ 1  2]
     [ 3  4]
     [ 5  6]
     [ 7  8]
     [ 9 10]
     [11 12]]
    
    

    在numpy中,为了统一做处理,只要有axis参数的,axis=0就是列,axis=1就是行

    #合并两个矩阵,其中axis=0表示合并两个矩阵的列
    print(np.concatenate((arr1,arr2),axis=0))  
    
    [[ 1  2]
     [ 3  4]
     [ 5  6]
     [ 7  8]
     [ 9 10]
     [11 12]]
    
    
    #合并两个矩阵,其中axis=0表示合并两个矩阵的行
    print(np.concatenate((arr1,arr2),axis=1))  
    
    [[ 1  2  7  8]
     [ 3  4  9 10]
     [ 5  6 11 12]]
    
    

    通过函数创建多维数组

    方法 详解
    array() 将列表转换为数组,可选择显式指定dtype
    arange() range的numpy版,支持浮点数
    linspace() 类似arange(),第三个参数为数组长度
    zeros() 根据指定形状和dtype创建全0数组
    ones() 根据指定形状和dtype创建全1数组
    eye() 创建单位矩阵
    empty() 创建一个元素全随机的数组
    reshape() 重塑形状
    #创建一维数组
    print(np.arange(10))
    
    [0 1 2 3 4 5 6 7 8 9]
    
    
    #取出1到10的数组,步长为2
    print(np.arange(1,10,2))
    
    [1 3 5 7 9]
    
    
    #创建一个3*4值为1的矩阵
    print(np.ones((3,4)))
    
    [[1. 1. 1. 1.]
     [1. 1. 1. 1.]
     [1. 1. 1. 1.]]
    
    
    #创建一个3*4*5 高为3,行为4,列为5的全0矩阵
    print(np.zeros((3,4,5)))
    
    [[[0. 0. 0. 0. 0.]
      [0. 0. 0. 0. 0.]
      [0. 0. 0. 0. 0.]
      [0. 0. 0. 0. 0.]]
    
     [[0. 0. 0. 0. 0.]
      [0. 0. 0. 0. 0.]
      [0. 0. 0. 0. 0.]
      [0. 0. 0. 0. 0.]]
    
     [[0. 0. 0. 0. 0.]
      [0. 0. 0. 0. 0.]
      [0. 0. 0. 0. 0.]
      [0. 0. 0. 0. 0.]]]
    
    
    #创建一个5*5的单位矩阵
    print(np.eye(5))
    
    [[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.]]
    
    

    矩阵的运算

    +  两个矩阵对应元素相加
    -  两个矩阵对应元素相减
    *  两个矩阵对应元素相乘
    /  两个矩阵对应的元素相除,如果都是整数则取商
    %  两个矩阵对应元素相除后取余数
    **n 单个矩阵每个元素都取n次方,如**2:每个元素都取平方
    
    
    print(arr1+arr2)
    
    [[ 8 10]
     [12 14]
     [16 18]]
    
    
    #点乘和转置
    print(np.dot(arr1,arr2.T))
    
    [[ 23  29  35]
     [ 53  67  81]
     [ 83 105 127]]
    
    
    #求逆矩阵
    print(np.linalg.inv(np.dot(arr1,arr2.T)))
    
    [[-3.51843721e+13  7.03687442e+13 -3.51843721e+13]
     [ 7.03687442e+13 -1.40737488e+14  7.03687442e+13]
     [-3.51843721e+13  7.03687442e+13 -3.51843721e+13]]
    
    
    #最大值
    print(arr1.max())
    
    6
    
    
    #最小值
    print(arr1.min())
    
    1
    
    
    arr1.argmax(axis=1)  # 获取矩阵最大元素的索引位置
    
    arr1.mean()  # 获取矩阵所有元素的平均值
    arr1.mean(axis=0)  # 获取矩阵每一列的平均值
    arr1.mean(axis=1)  # 获取矩阵每一行的平均值
    
    arr1.var()  # 获取矩阵所有元素的方差
    arr1.var(axis=0)  # 获取矩阵每一列的元素的方差
    arr1.var(axis=1)  # 获取矩阵每一行的元素的方差
    
    arr1.std()  # 获取矩阵所有元素的标准差
    arr1.std(axis=0)  # 获取矩阵每一列的元素的标准差
    arr1.std(axis=1)  # 获取矩阵每一行的元素的标准差
    
    np.median(arr1)  # 获取矩阵所有元素的中位数
    np.median(arr1,axis=0)  # 获取矩阵每一列的元素的中位数
    np.median(arr1,axis=1)  # 获取矩阵每一行的元素的中位数
    
    arr1.sum()  # 对矩阵的每一个元素求和
    arr1.sum(axis=0)  # 对矩阵的每一列求和
    arr1.sum(axis=1)  # 对矩阵的每一行求和
    
    arr1.cumsum()  # 累加和,如arr1=[1,2,3],arr1.cumsum=[1,3,6],第n个元素为前n-1个元素累加
    
    
    

    numpy生成随机数

    函数名称 函数功能 参数说明
    rand(d0,d1,⋯,dnd0,d1,⋯,dn) 产生均匀分布的随机数 dndn为第n维数据的维度
    randn(d0,d1,⋯,dnd0,d1,⋯,dn) 产生标准正态分布随机数 dndn为第n维数据的维度
    randint(low[, high, size, dtype]) 产生随机整数 low:最小值;high:最大值;size:数据个数
    random_sample([size]) 在[0,1)内产生随机数 size为随机数的shape,可以为元祖或者列表
    choice(a[, size]) 从arr中随机选择指定数据 arr为1维数组;size为数组形状
    uniform(low,high [,size]) 给定形状产生随机数组 low为最小值;high为最大值,size为数组形状
    shuffle(a) 与random.shuffle相同 a为指定数组
    np.random.seed(1)  #固定随机数,永不随机,固定
    print(np.random.rand(3,4))  #生成3*4的矩阵
    
    
    #RandomState()方法会让数据值随机一次,之后都是相同的数据
    rs = np.random.RandomState(1)
    print(rs.rand(3,4))
    
    [[4.17022005e-01 7.20324493e-01 1.14374817e-04 3.02332573e-01]
     [1.46755891e-01 9.23385948e-02 1.86260211e-01 3.45560727e-01]
     [3.96767474e-01 5.38816734e-01 4.19194514e-01 6.85219500e-01]]
    
    
  • 相关阅读:
    Java核心类库——线程Thread
    xml基本写法和dtd schema的用法,JAVA读写XML
    Java核心类库——文件和文件夹的管理File类
    使用文件依赖项缓存页输出
    根据 HTTP 标头缓存页的版本
    缓存 ASP.NET 页的某些部分
    根据请求浏览器缓存页的版本
    根据自定义字符串缓存页的版本
    缓存页的多个版本
    阿拉的宣告~~~
  • 原文地址:https://www.cnblogs.com/zuihoudebieli/p/11215958.html
Copyright © 2011-2022 走看看