• numpy 介绍与使用


    一、介绍

    中文文档:https://www.numpy.org.cn/

    NumPy是Python语言的一个扩展包。支持多维数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。NumPy提供了与Matlab相似的功能与操作方式,因为两者皆为直译语言。

    NumPy通常与SciPy(Scientific Python)和Matplotlib(绘图库)一起使用,这种组合广泛用于替代Matlab,是一个流行的技术平台。

    NumPy中定义的最重要的对象是称为ndarray的N维数组类型。它描述相同类型的元素集合,可以使用基于零的索引访问集合中元素。基本的ndarray是使用NumPy中的数组函数创建的: numpy.array。

    NumPy支持比Python更多种类的数值类型。NumPy数值是dtype(数据类型)对象的实例,每个对象具有唯一的特征。

    二、生成numpy数组

    1、方法一 使用np.array将list转换为numpy数组

    x=[[1,2],[3,4],[5,6]] 
    a=np.array(x)  #转换成numpy数组

    2、方法二 随机生成numpy数组

    import numpy as np
    
    a1=np.ndarray([12]) #生成随机的12位的数组
    a=np.random.randint(0,10,100)#范围内的整数,长度为100
    b=np.random.rand(40)#0到1的均匀分布,长度为40
    c=np.random.randn(10)#标准正态分布,长度为10
    d=np.random.normal(0,1,100)#生成指定正态分布,长度为100
    e=np.random.random(20)#0到1的均匀分布,长度20
    f=np.random.ranf(20)#0到1的均匀分布,长度20
    g=np.random.uniform(-1,1,100)#指定均匀分布,长度100
    

    3、顺序生成数组

    import numpy as np
    h=np.arange(12)#按顺序生成0-11的数组(类似pythn的range)
    b=np.arange(0,12,2)#python list的布长0,2,4,6,8等
    

    4、生成零数组、1数组、空数组

    import numpy as np
    
    #0数组
    a= np.zeros(shape=[4,10],dtype=np.float32)  #生成4*10的0数组,类型为float32
    print(a)
    
    #1数组
    b=np.ones(shape=[4,10],dtype=np.float32)
    print(b)
    
    #空数组(前面有0数组或1数组,就更前面一样,没有就是随机的数组)
    c=np.empty(shape=[4,10],dtype=np.float32)
    print(c)

    #生成one-hot数组(将0数组中指定位置的值改成1)

    #8,5,2,6(one-hot)
    
    a= np.zeros(shape=[4,10],dtype=np.float32)#8,5,2,6(one-hot)
    print(a)
    
    #遍历,修改对应的值为1
    for i,k in enumerate(a):
        if i == 0:
            k[8]=1
        elif i == 1:
            k[5]=1
        elif i == 2:
            k[2]=1
        else:
            k[6]=1
    print(a
    
    c=np.argmax(a,axis=1) #1所在的下标
    print(c) #[8 5 2 6]

     5、将字符串元素转为数值元素

    import numpy as np
    
    x = np.array(['1','2','3','4','5'],dtype=np.string_)
    y = x.astype(np.int8)#如果元素中有不为数字的元素,则会抛出异常

    三、设置numpy数组维度与常用方法

    1、设置数组的维度(使用reshape)

    #设置3维数组
    a=np.ndarray([12]) #定义0-11的12位numpy数组
    a1=a.reshape(2,2,3) #2*2*3的数组,(由2组数组,每组数组再由2组数组组成,里面没个数组由3组数组成)
    
    #定义2维数组
    b=np.arange(12).reshape(3,4) #类似range,从0开始到n的列表(这里是0-11的数字)
    print(b)
    
    #其它维度也是这么定义的

     2、数组的一些属性与方法

    import numpy as np
    
    b=np.arange((12),dtype=np.float32).reshape(2,2,3)  #定义数组类型np.float32
    
    #查看数组的一些属性
    np.shape(b) #形状,上面reshape的值,如(3,4),(2,2,3)
    b.shape   #和上面一样,获取形状值
    b.size    #数组、列表长度 如:12
    b.dtype   #获取类型,如int32
    b.ndim   #获取维度
    
    
    
    #数组复制
    a = np.arange(24).reshape(2,3,4)
    b = a.copy() #复制
    
    
    #数组排序
    a= np.array([12,45,1,6,8,9,32])
    a.sort()  #排序

    3、二维数组的轴使用

    import numpy as np
    
    a = np.arange(12).reshape(4,3)
    a[0,1]=20 #第0组,下标为1的值改为20(1改成20)
    print(a)
    b=np.argmin(a,axis=1)  #[0 0 0 0]
    print(b)
    c=np.min(a,axis=1) #获取每组数组的第1个数(0下标的值)
    print(c)
    d=np.max(a,axis=1)  #获取每组数组中最大的值
    print(d)
    c=a[:,0]    #获取每组数组0下标的值
    print(c)

     4、三维数组的轴使用

    import numpy as np
    
    a = np.arange(24).reshape(2,3,4)
    a[0,0,2]=66 #0下标数组,中的第0号下标的数组中下标为2的值改成66(把2改成66)
    print(a)
    
    b=np.max(a,axis=1)  #每个数组中下标相同的值,取下标的最大值,axis代表哪个轴
    print(b)
    '''结果
    [[ 8  9 66 11]
     [20 21 22 23]]'''
     
     c=np.sum(a,axis=1) #每组中下标相同的值相加的和
    print(c)
    '''结果
    [[12 15 82 21]
     [48 51 54 57]]
    '''
    
    c=np.mean(a,axis=1) #每组中下标相同的值的平均值
    print(c)
    '''结果
    [[ 4.          5.         27.33333333  7.        ]
     [16.         17.         18.         19.        ]]
    '''

    四、数组的广播机制

    1、形状相同的广播

    import numpy as np
    a=np.arange(12).reshape(4,3)
    b=3
    c=a+b
    print(a)
    print(c)  #广播后,全部数字加3了

    2、形状不相同的广播

    形状不相同,后缘维度要相同

    import numpy as np
    
    a=np.arange(12).reshape(4,3)
    print(a)
    print()
    b=[3,2,1] #后缘维度长度要相同,即上面reshape(4,3)的后面的数和b的长度要一致(3)
    print(a+b,'a+b') #每一行都按3,2,1顺序相加,如3+0,2+1,1+2,3+3依次类推

    五、numpy数组转置

    1、numpy数组转置

    import numpy as np
    
    a=np.arange(12).reshape(4,3)
    b=np.arange(12).reshape(3,4)
    c=np.dot(a,b)  #转置
    print(a)
    print(b)
    print(c)

    2、图像转成np数组

    图像的4个维度:N,H,W,C

    N:批次中的图像数量
    H:图像的高度
    W:图像的宽度
    C:图像的通道数(例如:3表示RGB,1表示灰度……)

    import numpy as np
    import PIL.Image as img
    
    path="1.jpg"
    i=img.open(path)
    
    print(np.shape(i))  #(153, 232, 3)
    arr = np.array(i) #图片转成numpy数组
    # print(arr)
    a=np.arange(24).reshape(2,3,4)  #设置一个0-23的3维数组
    print(a)
    b=a.T #T方法转置,
    print(b.shape) #(4, 3, 2)
    print(b)
    c=np.transpose(arr,[1,0,2]) #转置,轴对换 把(153, 232, 3) 改成(232, 153, 3)
    print(c)
    print(c.shape)

    六、numpy数组的切片

    1、二维数组的切片

    import numpy as np
    
    a=np.arange(12).reshape(4,3) #生成numpy数组
    b = a[1:,:2]  #从下标为1的数组中,0-2(即0,1)下标的值
    c = a[0][0]   #取下标0的数组中,下标为0的值(0)
    d = a[0]      #取下标为0的数组
    e = a[0][2]   #取下标为0的数组中。下标为2的值

    2、三维数组的切片

    import numpy as np
    
    a=np.arange(24).reshape(2,3,4)
    b = a[:1,:,2:] #取下标到1的数组(即下标为0,到2就是0,1)中,所有下标数组中,下标从2开始到所有的值
    c = a[1,2,1] #取下标为1的数组中下标为2的数组中,下标为1的值
    d = a[1][2][3] #取下标为1的数组中下标为2的数组中,下标为2的值

    3、其它维度的数组以此类推

    七、数组拼接

    1、方式一、转成list再append追加

    import numpy as np
    
    a = np.arange(12).reshape(3,4)
    b = np.array([4,5,6,7])
    #将b放到a数组的后面
    c=a.tolist()  #将a转成list类型
    c.append(b.tolist())

    2、方式二、转成list后使用extend

    import numpy as np
    
    a=np.arange(12).reshape(3,4)
    b=np.array([4,5,6,7])
    a=a.tolist()
    a.extend([b.tolist()])
    print(a)

    3、轴拼接

    import numpy as np
    
    a=np.arange(12).reshape(3,4)
    b=np.arange(12).reshape(3,4)
    c=np.vstack((a,b))  #将b最佳到a的后面,(拼接0轴)
    print(c.shape) #(6, 4)
    d=np.hstack((a,b))  #把a和b数组中下标相同的列表合并(拼接1轴)
    print(d.shape) #(3, 8)

    八、使用numpy采样例子

    import numpy as np
    import os
    import PIL.Image as img
    
    path_image = r"F:/test4/img" #图片目录路径
    
    class Sample:
        '''读取所有图像数据'''
        def read_data(self):
            self.img_arr=[]
            #遍历系统文件夹里的文件名
            for name in os.listdir(path_image):
                imgs = img.open(r"{0}/{1}".format(path_image,name))
                images=(np.array(imgs)/255-0.5)*2#/0.5(除0.5) #神经网络通常不会使用太大的数据。所以除255等操作,尽量归1化(通常使用正负1之间的数据)
                self.img_arr.append(images)
            return self.img_arr
    
        def get_batch(self,set):
            '''获取随机数据采样的批次'''
            self.read_data()
            self.get_arr = []
            for i in range(set):
                #生成图像个数长度内的一个随机数字
                num=np.random.randint(0,len(self.img_arr))
                #将生成的随机数作为图像数据集的索引
                imge=self.img_arr[num]
                #把得到的随机图像数据累计起来
                self.get_arr.append(imge)
            return self.get_arr
    
    sample=Sample()
    # sample.read_data()
    #查看随机图像批次形状(4维数组)
    print(np.shape(sample.get_batch(100))) #100张,48*48尺寸的图片,图像的通道数(例如:3表示RGB)
    #查看随机获得的图像数据
    sample.get_batch(10)
    

      

    九、pandas简单使用

    1、pandas介绍

    pandas是基于NumPy构建的,让以NumPy为中心的应用变得更加简单

    2、pandas简单实用

    import numpy as np
    from pandas import Series,DataFrame
    
    #左边是索引,右边是数据
    a=Series([1,2,3,4],dtype=np.float32) #创建Series数据结构,类型为np.float32
    print(a)
    '''
    0    1.0
    1    2.0
    2    3.0
    3    4.0
    dtype: float32
    '''
    print(a.values)  #值[1,2,3,4]
    print(a.index)  #RangeIndex(start=0, stop=4, step=1) #长度0-4,布长为1
    
    #自定义索引(值和索引长度一样)
    b=Series([4,5,6,7],index=["a","b","c","d"])
    print(b)
    '''
    a    4
    b    5
    c    6
    d    7
    dtype: int64
    '''
    
    b["a"]=8  #改变索引为"a"的值为8
    print(b)
    #自定义索引方式二
    b=Series({"A":1,"B":2})
    print(b)
    
    #DataFrame类型,类似课表或者excel表格一样,拥有行索引和列索引
    c=DataFrame(data=[[2,4,6],[7,8,3],[4,7,5]],index=["d","e","f"],columns=["a","b","c"])
    print(c)
    '''
       a  b  c
    d  2  4  6
    e  7  8  3
    f  4  7  5
    '''
  • 相关阅读:
    tomcat部署项目时 报错Tomcat version 7.0 only supports J2EE 1.2, 1.3, 1.4, and Java EE 5 and 6 Web modules
    异常:Caused by: java.lang.NoClassDefFoundError: org/springframework/web/context/WebApplicationContext
    java安全管理器SecurityManager介绍
    Mybatis框架基础支持层——反射工具箱之Reflector&ReflectorFactory(3)
    Mybatis框架基础支持层——解析器模块(2)
    Mybatis框架可视化(1)
    JDK动态代理简单使用(2)
    代理(1)
    动态代理源码分析(3)
    springboot(十七)-使用Docker部署springboot项目
  • 原文地址:https://www.cnblogs.com/zhangb8042/p/11200793.html
Copyright © 2020-2023  润新知