zoukankan      html  css  js  c++  java
  • 小丸子踏入python之路:python_day04(科学计算库NumPy)

    NumPy网址:http://www.numpy.org/

    NumPy的概述

    NumPy是用Python进行科学计算的基本包。它包含了其他东西:

    •  一个强大的n维数组对象。
    •  复杂的(广播)函数
    •  集成C/ c++和Fortran代码的工具。
    •  有用的线性代数,傅里叶变换,和随机数能力。
         除了其明显的科学用途外,NumPy还可以作为通用数据的高效多维容器。可以定义任意数据类型。这使得NumPy能够无缝地快速集成各种数据库。NumPy是根据BSD许可协议授权的。
     
        numpy(Numerical Python)提供了python对多维数组对象的支持:ndarray,具有矢量运算能力,快速、节省空间。numpy支持高级大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。
     

    NumPy库的安装:

        在anaconda中已经安装了这个库,不用自己安装。

      如何查看anaconda中安装的库呢?

         打开 anaconda prompt,输入conda list后回车即可。

      如果真的需要安装,则直接输入:pip install (tensorflow)即可

     
    NumPy的核心操作
     
    1. NumPy可以打开 .txt文档
    import numpy
    
    #用NumPy的genfromtxt()方法打开一个.txt的文件
    world_alcohol = numpy.genfromtxt("D:softwarespython_test.txt", delimiter = ",", dtype = str)
    print(type(world_alcohol))             #输出打开文件的类型
    print(world_alcohol)                   #输出内容
    #print(help(numpy.genfromtxt))         #可通过help()来获得函数的详细说明

      2.NumPy的array数据结构

             numpy.array() 功能:创建一个数组。

    import numpy
    
    vector = numpy.array([5, 10, 15, 20])                          #创建一个向量
    matrix = numpy.array([[5, 10, 15],[20, 25, 30],[35, 40, 45]])  #创建一个矩阵
    print (vector)      #输出向量
    print (matrix)      #输出矩阵
    print(type(vector),type(matrix))       #输出其类型为  .ndarray
    #print(help(numpy.array))     

    运行结果:

    3.ndarray数据类型的属性【即维度(行列数).shape】

      用numpy.array()生成的不管是向量还是矩阵都是 .ndarray类型的。可以用.shape来得到其行列数

    import numpy
    
    #调用.ndarray类型数据的属性 用.shape  (矩阵的行列数)  
    vector = numpy.array([1,22,333,4444])           #创建一个向量
    print(vector.shape)                             #打印向量vector的属性
    
    #将以上两步骤合并
    #print(numpy.array([1,22,333,4444]).shape)   
    
    matrix  = numpy.array([[2,3,4,5],[5,6,7,8],[7,8,9,10]])   
    print(matrix.shape)

    运行结果:

    (4,)            #此向量有四个元素
    (3,4)           #此矩阵为3行4列

      4. ndarray中元素的数据类型是统一的

      在python中的list中可以输入任何类似的数据,但是在.ndarray中,元素的数据必须是相同的,当出现不同时,其在创建时会自动将其转换为相同类型的数据元素。

    import numpy
    
    numbers_1 = numpy.array([1,2,3,4])      #创建一个向量
    print(numbers_1)                        #打印此向量
    print(numbers_1.dtype)                  #打印此向量元素的类型
    
    numbers_2 = numpy.array([1,2,3,4.0])
    print(numbers_2)
    print(numbers_2.dtype)
    
    numbers_3 = numpy.array([1,2,3,'4'])
    print(numbers_3)
    print(numbers_3.dtype)

    运行结果:

    [1 2 3 4]                    #当向量元素全部为整数时
    int32                          
    [1.  2.  3.  4.]             #当将向量的最后一个元素改成4.0后
    float64
    ['1'  '2'  '3'  '4']         #当将向量的最后一个元素改成 ‘4’后
    <u11

      5.用numpy处理.txt文件

      文件数据形式如下:

      读取此文件,并指定数据的分隔符为 “,”由于第一行不是数据,可将其去掉。

    import numpy
    
    #读取wodld_alcohol.txt文件,并指定分隔符为“,”(delimiter = ',')指定读进来的数据的类型为str,并且去掉文件中的第一行(skip_header=1)
    world_alcohol = numpy.genfromtxt('D:softwaresworld_alcohol.txt',delimiter = ',',dtype = str,skip_header = 1)
    print(world_alcohol)

    运行结果:

      其运行后的结果也是用矩阵表示的,所有可以通过元素所在矩阵中的位置,读取想要抽取出来的数据。

    举例说明:

    uruguay = world_alcohol[1,4]                #选矩阵的第二行第五列数据(因为其下标是从0开始的,所以应该是[1,4])
    third_country = world_alcohol[2,2]          #选矩阵的第三行第二列数据(同样下标是从0开始的,所以应该为[2,2])
    print(uruguay)
    print(third_country)

    运行结果:

      6.打印向量或矩阵中指定位置的值

    #打印向量前3个值
    vector = numpy.array([5,10,15,20])
    print(vector[0:3])        # python中的切片问题,是从0开始的。并且[0:3]表示:包括0不包括3                   

    运行结果:

    #打印矩阵指定位置的数据
    matrix = numpy.array([
                          [5,10,15],
                          [20,25,30],
                          [35,40,45]
                        ])
    print(matrix[:,1])         #打印矩阵的第二列。。行值全选,列值选1  ([:,1]的样子,逗号前表示行,逗号后表示列)
    print(matrix[:1])      
    
    print(matrix[:,0:2])       #打印矩阵的前两列
    print(matrix[1:3,0:2])     #打印矩阵的后两行与前两列的交集处

    运行结果:

      7. 用“==”与ndarray中每个元素进行比较

      将==后边的数与向量中的每个元素进行比较,如果相等,Python解释器返回True:否则返回False。

    import numpy
    
    vector = numpy.array([5,10,15,20])
    vector == 10            #将10与向量中的每个元素进行比较,相等返回true,否则返回false

      运行结果:

      对于矩阵,用法相同。

    import numpy
    
    matrix = numpy.array([
                          [5,10,15],
                          [10,15,20],
                          [15,20,25]
                         ])
    print(matrix)         #将15与矩阵中的每一个元素比较,相等返回true,否则返回false
    matrix == 15

    运行结果:

      8.在7的基础上,得到了true的,将是true的值取出

     8.1

    vector = numpy.array([5,10,15,20])
    equal_to_ten = (vector == 10)       #取出比较后的结果
    print(equal_to_ten)                 #打印
    print(vector[equal_to_ten])         #打印为true对应的那个值

    运行结果

    8.2

    vector = numpy.array([5,10,15,20])
    equal_to_ten_and_five = (vector == 10) & (vector ==5)      #取出比较后的结果
    print(equal_to_ten_and_five)   

    运行结果:

    8.3

    vector = numpy.array([5,10,15,20])
    equal_to_ten_or_five = (vector == 10) | (vector ==5)      #取出比较后的结果
    print(equal_to_ten_or_five)  

     运行结果:

      9. NumPy中的类型转换

       可以用 ndarray.astype() 方法来转换array中的数据类型。

    #可以用 ndarray.astype() 方法来转换array中的数据类型。
    vector = numpy.array(["1","2","3"])
    print(vector.dtype)
    print(vector)
    vector = vector.astype(float)
    print(vector.dtype)
    print(vector)

    运行结果:

     

      10.numpy中求array中的最小/大值

    #求array元素中的最小值
    vector = numpy.array([5,10,15,20])
    print("最小值 = ",vector.min())
    print("最大值 = ",vector.max())

    运行结果:

      11.numpy中对矩阵进行按行/列求和

    #指定维度,对矩阵进行按行/列 求和
    matrix = numpy.array([
                          [5,10,15],
                          [20,15,20],
                          [1,20,25]
                         ])   
    print(matrix.sum(axis = 1))       #axis = 1 对矩阵进行按行求
    print(matrix.sum(axis = 0))       #axis = 0 对矩阵进行按列求和

    运行结果:

      12. np.arange() 用来创建一个数组 (通常用其来造一个索引,或从0开始的一个排列)

     import numpy as np     #造用numpy的别名 np,用np来代替numpy

    import numpy as np                     #造一个numpy的别名np
    print(np.arange(15))                   #得到一个[0--14]的向量
    a = np.arange(15).reshape(3,5)         #将[0--14]的一个向量转换为3×5的矩阵形式
    a 

    运行结果:

      13.基于12的关于a的属性

    print("a的shape值 = " ,a.shape)              #返回a的行列数
    print("a的维数 =  ", a.ndim)                 #返回a的维数
    print("a的元素类型 = ", a.dtype.name)
    print("a的元素数 = ", a.size)

    运行结果:

       14.矩阵初始化的方法 【常用于初始化模型的矩阵

      14.1 创建一个元素全为0的(3×4)矩阵,默认元素类型为float

    import numpy as np
    
    np.zeros((3,4))     #创建一个元素全为0的(3×4)矩阵,默认元素类型为float

    运行结果:

      14.2 创建一个元素全为1的三维矩阵(2×3×4),并将元素类型改为int32

    import numpy as np
    
    np.ones((2,3,4),dtype = np.int32)   #创建一个3维的矩阵,并且初始值定为1,且将其元素类型改为int32

    运行结果:

      15.用arange()创建数字序列/矩阵

      15.1 用arange()创建序列向量

    import numpy as np
    
    #创建一个数字序列,np.arange(起始值,终止值,每次的增加值)
    #从谁开始,到谁结束,每次+谁
    np.arange(10,30,5)

     运行结果:

    import numpy as np
    
    #创建一个数字序列,np.arange(起始值,终止值(小于它),每次的增加值)
    np.arange(0,2,0.3)

    运行结果:

       15.2 用arange().reshape()创建矩阵

    import numpy as np
    
    #创建一个数字序列,np.arange(起始值,终止值(小于它),每次的增加值)
    #用.reshape(a,b)确定矩阵的型 (a行b列)
    np.arange(0,1.8,0.3).reshape(2,3)

    运行结果:

      16.NumPy的随机模块(random())  [用于初始化权重矩阵Θ]

      用NumPy的random.random()模块,生成的随机数在【0,1】之间

    np.random.random()  意思是:调用np的random模块,再进入random模块下的random()方法

    import numpy as np
    
    np.random.random((2,3))    #生成一个元素为随机数的2×3矩阵

    运行结果:

      17.用np.linspace()生成矩阵

    import numpy as np
    from numpy import pi
    
    #用np.linspace()与np.arange()生成矩阵元素的方法有所不同,
    #np.linspace()是在起始值和终止值之间平均的生成100个(或其他个)数
    np.linspace(0, 2*pi, 100) 
    #np.sin(np.linspace(0, 2*pi, 100))

    运行结果:

      18.NumPy的“+”,“-”,“×”,“÷”等操作

      18.1 向量的操作

    import numpy as np
    
    a = np.array([20,30,40,50])
    b = np.arange(4)    #相当于np.arange(0,4,1)
    print("a = ",a)
    print("b = ",b)
    
    c = a - b
    print("c = ",c)
    
    c = c - 1
    print("c - 1 = ",c)
    
    print("b**2 = ",b**2)
    print("a<35 = ",a<35)

    运行结果:

      18.2 矩阵的操作

    A*B  表示求两个矩阵的内积(对应位置相乘)

    A.dot(B)  表示矩阵的乘法   np.dot(A,B)一样

    import numpy as np
    
    A = np.array([[1,1],
                  [0,1]])
    B = np.array([[2,0],
                  [3,4]])
    print("A = ", A)
    print("-----------------------")
    print("B = ",B)
    print("-----------------------")
    print("A*B = ",A*B)                 #A和B的内积
    print("-----------------------")
    print("A.dot(B) = ", A.dot(B))      #矩阵乘法
    print("-----------------------")
    print("dot(A,B) = ", np.dot(A,B))   #同为矩阵乘法

    结果:

      19.NumPy的特殊运算

      np.exp():返回e的n次方,e是一个常数为2.71828

           np.sqrt():开方

    import numpy as np
    B = np.arange(3)
    print(B)
    print(np.exp(B))    #返回e的B次幂
    print(np.sqrt(B))   #返回B的开方

    运行结果:

      np.floor()  :进行向下取整

         a.ravel(): 把矩阵伸长为一个向量

      a.shape = (a1,a2): 把a矩阵转换成 a1×a2 型的矩阵

         a.T :对矩阵a进行转置

    import numpy as np
    
    #先通过随机数生成一个3×4的矩阵,因为取值在【0,1】,所以×10 ,再通过np.floor()函数,向下取值
    #最终得到矩阵a
    a = np.floor(10*np.random.random((3,4)))      
    print(a)
    print("-------------------")
    print(a.ravel())       #通过.raval()函数将矩阵a伸长为一个向量
    print("--------------------")
    a.shape = (6,2)        #通过.shape函数将向量定义为6×2的形式
    print(a)
    print("--------------------") 
    print(a.T)             #a的转置

    运行结果:

      20.用numpy进行矩阵的拼接以及切分

    20.1 用numpy进行矩阵的拼接

    np.vstack((拼接矩阵A,拼接矩阵B))和np.hstack((拼接矩阵A,拼接矩阵B))

    import numpy as np
    
    #用np.vstack((拼接矩阵A,拼接矩阵B))和np.hstack((拼接矩阵A,拼接矩阵B))操作进行矩阵的拼接
    #np.vstack()和np.hstack()的参数都是一个元组(a,b)

    a = np.floor(10*np.random.random((2,2))) b = np.floor(10*np.random.random((2,2))) print(a) print("-------------------") print(b) print("-------------------") print(np.vstack((a,b))) #按行拼接矩阵 print("-------------------") print(np.hstack((a,b))) #按列拼接矩阵

    运行结果:

    20.2 用numpy进行矩阵的分割

    (np.hsplit(待分割的矩阵,需要平均分割的份数a)   竖着切)

    np.vsplit(待分割的矩阵,需要平均分割的份数a)     横着切

    import numpy as np
    
    #将矩阵竖着切
    #用np.hsplit(待分割的矩阵,需要平均分割的份数a)   此时会得到a个array
    #或直接用元组(a,b)指定要切分的位置。
    #np.hsplit(待分割矩阵,(a,b)在a处和b处分别切一刀)
    
    a = np.floor(10*np.random.random((2,12)))   #创建一个2×12的矩阵
    print(a)
    print("-----------------")
    print(np.hsplit(a,3))       #将矩阵竖着切
    print("-----------------")
    print(np.hsplit(a,(3,5)))
    print("---------------------------------")
    
    #将矩阵横着切
    #用np.vsplit(待分割的矩阵,需要平均分割的份数a)   此时会得到a个array
    #或直接用元组(a,b)指定要切分的位置。
    #np.vsplit(待分割矩阵,(a,b)在a处和b处分别切一刀)
    
    b = np.floor(10*np.random.random((12,2)))    #创建一个12×2的矩阵
    print(b)
    print(np.vsplit(b,3))           #将矩阵横着切
    print("-----------------")
    print(np.vsplit(b,(4,7)))       #在第四行和第七行分别切一刀

    运行结果:

       21.NumPy中的复制

      21.1 不算复制的复制(赋值)

        a 和 b指的是用一个东西

    import numpy as np
    
    #一、简单的赋值不会复制数组对象或其数据
    # a 和 b指的是同一个数据,有相同的id,对他们各自操作不能分开。
    #即a 和 b是对同一ndarray目标的不同两个名字 

    a = np.arange(12) b = a print("b is a :",b is a) b.shape = (3,4) #改变b的型 print("a的shape: ",a.shape) print("b的shape: ",b.shape) print("a的id: ",id(a)) print("b的id: ",id(b))

     运行结果:

     21.2 浅复制 (a.view()

        a和b的id与shape都可不同,但是数据却是相同的

    import numpy as np
    
    #用a.view()进行浅复制
    a = np.arange(12)
    c = a.view()
    print("c is a :",c is a)
    c.shape = (2,6)
    print("a的shape: ",a.shape)
    print("c的shape: ",c.shape)
    c[0,4] = 1234
    print(c)               #改变c中的一个元素值
    print("---------------------")
    print(a)               #在改变了c的后,a的也跟着改变了
    print("a的id: ",id(a))
    print("c的id: ",id(c))

    运行结果:

      21.3 深复制 (a.copy()) 完全复制

        用a.copy()进行了一个完全复制,是两个不同的id,元素相同,可分别进行操作。

    import numpy as np
    
    #完全复制,并且对各自的操作不影响另一个,是两个独立的矩阵
    a = np.arange(8).reshape(2,4)
    d = a.copy()
    print("d is a: ",d is a)
    d[0,0] = 9999           #更改d的第一个值
    print(a)                #a的值并没有发生变化
    print("---------------------------")
    print(d)
    print("a的id: ",id(a))    #a和d的id也不同
    print("d的id: ",id(d))

    运行结果:

      22.用.argmax()搜寻矩阵行/列中的最大值

      通过.argmax()来返回矩阵中最大值所对应的index索引。

      若.argmax(axis=0)返回的是矩阵中每一列最大值的索引,而.argmax(axis=1)则返回每一行最大值的索引

    import numpy as np
    
    #通过.argmax()来返回矩阵中最大值所对应的index索引。
    #若.argmax(axis=0)返回的是矩阵中每一列最大值的索引,而.argmax(axis=1)则返回每一行最大值的索引
    
    data = np.sin(np.arange(20)).reshape(5,4)      #对0-19这个序列取sin值后,再设置为5×4的型
    print(data)
    ind = data.argmax(axis = 0)                    #axis=0,表示搜寻列的最大值
    print("max的index: ",ind)
    data_max = data[ind,range(data.shape[1])]      #打印出最大索引对应的数据
    print(data_max)

    运行结果:

      23.用np.tile()批量扩展矩阵

      np.tile(向量a, (元组))——np.tile(向量a,(行变为a的n倍,列变为a的m倍))

    import numpy as np
    
    a = np.arange(0,40,10)         #生成一个序列
    print(a)
    b = np.tile(a,(4,2))           #得到新的矩阵,使得行是a的4倍,列是a的倍
    print(b) 

    运行结果:

      24.基于np.sort()的NumPy的排序问题

      用np.sort()进行排序,当axis=1,按行排序。
                当axis=0,按列排序

    用np.argsort()返回的是排序后对应值的索引index

    import numpy as np
    
    #用np.sort()进行排序,当axis=1,按行排序。
    #                   当axis=0,按列排序
    a = np.array([[4,3,5],[1,2,1]])
    print(a)
    print("-----------------------")
    b = np.sort(a,axis=1)
    print(b)
    
    a.sort(axis = 1)
    print("-----------------------")
    print(a)
    a = np.array([4,3,1,2])
    j = np.argsort(a)            #得到的是从小到大数值排列的索引值[2,3,1,0]
    print("-----------------------")
    print(j)
    print("-----------------------")
    print(a[j])                  #通过索引值得到排序的值

    运行结果:

    http://localhost:8888/notebooks/NumPy_test.ipynb

  • 相关阅读:
    阅读<SQL语言艺术>实践五
    <SQL语言艺术>阅读计划
    文本类文件与VS关联实践
    接口开发原则
    逻辑部分开发原则
    <海量数据库解决方案>2011022301
    5800对于存储卡密码设置问题
    [转]Delphi用户登录窗口框架
    20世纪科学界最重要的12本书
    [转]UDP/TCP穿越NAT的P2P通信方法研究(UDP/TCP打洞 Hole Punching)
  • 原文地址:https://www.cnblogs.com/qtww56/p/8718567.html
Copyright © 2011-2022 走看看