zoukankan      html  css  js  c++  java
  • Numpy 学习笔记

        Numpy数组是一个多维数组,称为ndarray。有两个部分组成:
        ·实际的数据
        ·描述这些数据的元数据
        >>> import numpy as np
        >>> ar = np.array([1,2,3,4,5])
        >>> print(ar)
        [1 2 3 4 5]
        >>> print(ar.ndim)  # 输出数组维度的个数(轴数或秩)
        1
        >>> print(ar.shape)  # 输出维度数,n行m列数组,shape为(n,m)
        (5,)
        >>> print(ar.size)    # 输出元素的个数,n行m列的数组,元素总个数为n*m
        5
        >>> print(ar.dtype)  # 数组元素的类型
        int32
        >>> print(ar.itemsize) # 每个元素的字节大小,int32为4,float64为8
        4
        >>> print(ar.data)   # 包含实际数组元素的缓冲区
        <memory at 0x000001A4FE5C4588>
        >>> ar
        array([1, 2, 3, 4, 5])
        
        >>> # 创建数组:array()函数,可以是列表、元组、数组、生成器等
        >>> ar1 = np.array(range(10))
        >>> ar1
        array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
        
        >>> ar2 = np.array([1,2,3,4])
        >>> ar2
        array([1, 2, 3, 4])
        
        >>> ar3 = np.array([1.1,2.1,3,4])  # 元素都是浮点型
        >>> ar3
        array([1.1, 2.1, 3. , 4. ])
        
        >>> ar4 = np.array([[1,2,3],('a','b','c')])
        >>> ar4
        array([['1', '2', '3'],
               ['a', 'b', 'c']], dtype='<U11')
        
        >>> ar5 = np.array([[1,2,3],('a','b','c','d')])  # 嵌套的数量不一致
        >>> ar5
        array([list([1, 2, 3]), ('a', 'b', 'c', 'd')], dtype=object)
        
        >>> a1 = np.array([1,2,3])
        >>> a2 = np.array([4,5,6])
        >>> a3 = np.array([a1,a2])
        >>> a3
        array([[1, 2, 3],
               [4, 5, 6]])
        
        # 创建数组 arange()函数
        >>> print(np.arange(10))
        [0 1 2 3 4 5 6 7 8 9]
        >>> print(np.arange(10.0))  # 元素都是浮点型
        [0. 1. 2. 3. 4. 5. 6. 7. 8. 9.]
        >>> print(np.arange(2,5))
        [2 3 4]
        >>> print(np.arange(2,5,2))
        [2 4]
        
        >>> ar = np.arange(16).reshape(4,4)
        >>> ar
        array([[ 0,  1,  2,  3],
               [ 4,  5,  6,  7],
               [ 8,  9, 10, 11],
               [12, 13, 14, 15]])
        
        >>> # 创建数组:linspace()返回指定上计算的num个均匀间隔的样本
        >>> ar1 = np.linspace(2.0,3.0,num=5)  # 区间内均匀取5个元素,默认num为50
        >>> ar1
        array([2.  , 2.25, 2.5 , 2.75, 3.  ])
        
        >>> ar2 = np.linspace(2.0,3.0,num=5,endpoint=False)  # endpoint=False表示右端点值不取
        >>> print(ar2)
        [2. 2.2 2.4 2.6 2.8]
        
        >>> ar3 = np.linspace(2.0,3.0,num=5,retstep=True)  # retstep=True表示返回步骤
        >>> print(ar3)			# 返回array和步长
        (array([2.  , 2.25, 2.5 , 2.75, 3.  ]), 0.25)
        
        # 创建数组 zeros()/zeros_like()/ones()/ones_like()
        # numpy.zeros(shape,dtype=float,order=’C’)
        # shape:数组维度数,二维以上需用(),参数为整数
        # dtype:数据类型,默认numpy.float64
        # order:是否在存储器中以C或Fortran连续(按行或列方式)存储多维数据
        
        >>> ar1 = np.zeros(5) 
        >>> ar1
        array([0., 0., 0., 0., 0.])
        
        >>> ar2 = np.zeros((2,2),dtype = np.int)
        >>> ar2
        array([[0, 0],
               [0, 0]])
        >>> ar3 = np.array([[1,2,3],[4,5,6]])
        # zeros_like() 返回与指定数组形状类型相同的零数组
        >>> ar3
        array([[1, 2, 3],
               [4, 5, 6]])
        >>> ar4 = np.zeros_like(ar3)
        >>> ar4
        array([[0, 0, 0],
               [0, 0, 0]])
        
        # 创建单位矩阵
        >>> ar1 = np.eye(5)
        >>> ar1
        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.]])
        
        # 数组切片
        >>> ar = np.arange(16).reshape(4,4)
        >>> ar
        array([[ 0,  1,  2,  3],
               [ 4,  5,  6,  7],
               [ 8,  9, 10, 11],
               [12, 13, 14, 15]])
        >>> ar[2]              # 截取第三行
        array([ 8,  9, 10, 11])
        >>> ar[2][1]            # 截取第三行第二个
        9
        >>> ar[2,1]             # 截取第三行第二个
        9
        >>> ar[1:3]             # 截取第二到三行
        array([[ 4,  5,  6,  7],
               [ 8,  9, 10, 11]])
        >>> ar[:2,1:]            # 截取1、2行,2、3、4列的二维数组
        array([[1, 2, 3],
               [5, 6, 7]])
        
        
        以下内容使用jupyter_notebook
        
        [In]:
        # 生成随机数
        import numpy as np
        samples = np.random.normal(size=(4,4)) # 生成标准正态分布的4*4的样本值(二维数组)
        print(samples)
        
        [Out]:
        [[ 0.873187   -0.79028849 -1.34830254  0.20502978]
         [ 0.173149    2.27029103 -0.17089641 -1.58288984]
         [ 1.284522   -1.50668781 -0.16048419 -1.41927718]
         [ 0.41458879  0.43483858 -0.51511941 -0.02804412]]
        
        [In]:
        import numpy as np
        samples = np.random.normal(size=(1000)) # 生成一维随机数组
        import matplotlib.pyplot as plt
        plt.hist(samples)                     # 绘制直方图
        
        [Out]:
        (array([  2.,   2.,  36., 112., 218., 276., 224., 105.,  20.,   5.]),
         array([-3.94221935, -3.21586594, -2.48951252, -1.76315911, -1.0368057 ,
                -0.31045229,  0.41590113,  1.14225454,  1.86860795,  2.59496137,
                 3.32131478]),
         <a list of 10 Patch objects>)
        

    
        
        
        [In]:
        import numpy as np
        samples = np.random.normal(size=(1000)) 
        import matplotlib.pyplot as plt
        plt.hist(samples,bins = 50)            # 绘制直方图,指定50个阶
        
        [Out]:
        (array([ 1.,  1.,  1.,  0.,  2.,  2.,  2.,  2.,  5.,  9., 17.,  8.,  5.,
                25., 17., 26., 34., 35., 34., 50., 42., 45., 50., 39., 63., 47.,
                50., 42., 41., 44., 33., 39., 33., 36., 29., 19., 15., 13., 10.,
                 8.,  5.,  4.,  3.,  5.,  5.,  2.,  0.,  0.,  1.,  1.]),
         array([-3.10211851, -2.97671477, -2.85131103, -2.72590729, -2.60050355,
                -2.4750998 , -2.34969606, -2.22429232, -2.09888858, -1.97348484,
                -1.8480811 , -1.72267735, -1.59727361, -1.47186987, -1.34646613,
                -1.22106239, -1.09565864, -0.9702549 , -0.84485116, -0.71944742,
                -0.59404368, -0.46863993, -0.34323619, -0.21783245, -0.09242871,
                 0.03297503,  0.15837878,  0.28378252,  0.40918626,  0.53459   ,
                 0.65999374,  0.78539748,  0.91080123,  1.03620497,  1.16160871,
                 1.28701245,  1.41241619,  1.53781994,  1.66322368,  1.78862742,
                 1.91403116,  2.0394349 ,  2.16483865,  2.29024239,  2.41564613,
                 2.54104987,  2.66645361,  2.79185736,  2.9172611 ,  3.04266484,
                 3.16806858]),
        <a list of 50 Patch objects>)
    

    
        
        [In]:
        # numpy.random.rand(d0,d1,……,dn)生成一个[0,1)的随机浮点数或n维随机数组(均匀分布)
        a1 = np.random.rand()  # 生成随机浮点数
        print(a1,type(a1))
        
        [Out]:
        0.600512724429105 <class 'float'>
        
        [In]:
        a2 = np.random.rand(4)  # 生成形状为4的一维数组
        print(a2,type(a2))
        
        [Out]:
        [0.91518171 0.09333734 0.4020652  0.83582766] <class 'numpy.ndarray'>
        
        [In]:
        a3 = np.random.rand(2,3)  # 生成形状为2*3的二维数组
        print(a3,type(a3))
        
        [Out]:
        [[0.72906892 0.32699937 0.86482124]
         [0.11489558 0.22683691 0.64697615]] <class 'numpy.ndarray'>
        
        [In]:
        sample1 = np.random.rand(1000)  # 生成形状为1000的一维数组
        sample2 = np.random.rand(1000)
        plt.scatter(sample1,sample2)
        
        [Out]:
    

    
        [In]:
        # numpy.random.randn(d0,d1,……,dn)生成一个随机浮点数或n维随机数组(正态分布)
        sample1 = np.random.randn(1000)
        sample2 = np.random.randn(1000)
        plt.scatter(sample1,sample2)
        
        [Out]:
    

    
        
        [In]:
        # numpy.random.randint(low,high=None,size=None,dtype='1')生成一个整数或n维整数数组
        # high不为None时,取[low,high)之间的随机数,否则取值[0,low)之间的随机整数
        # dtype参数只能是int类型
        a1 = np.random.randint(2) #low=2,生成一个[0,2)之间的随机整数
        print(a1)
        
        [Out]:
        [0 0 0 1 0]
        
        [In]:
        a3 = np.random.randint(2,8,size=5) #low=2,high=8,size=5,生成5个[2,8)之间的随机整数
        print(a3)
        
        [Out]:
        [7 4 4 5 2]
        
        [In]:
        #low=2,size=(2,3)生成一个2*3的整数数组,取值[0,2)随机整数
        a4 = np.random.randint(2,size=(2,3)) 
        print(a4)
        
        [Out]:
        [[1 0 0]
         [1 1 0]]
        
        [In]:
        #low=2,high=8,size=(2,3)生成一个2*3的整数数组,取值[2,8)随机整数
        a5 = np.random.randint(2,8,size=(2,3)) print(a5)
        [[4 2 2]
         [3 3 6]]
        
        [In]:
        #随机数种子
        rng = np.random.RandomState(1)    # 随机种子,种子确定不变的随机数
        xtrain = 10 * rng.rand(30)
        ytrain = 8 + 4 * xtrain + rng.rand(30)  # 样本关系y=8+4x,加个随机数产生浮动
        
        fig = plt.figure(figsize = (12,3))
        ax1 = fig.add_subplot(1,2,1)
        plt.scatter(xtrain,ytrain,marker = '.',color = 'k')
        plt.grid()
        plt.title('样本数据散点图')
        
        [Out]:
    

    
        
        
        [In]:
        # 通用函数
        # .T方法:转置
        ar1 = np.arange(10)    # 生成0-9的一维数组
        ar2 = np.ones((5,2))   # 生成5行2列的全1矩阵
        print(ar1,'
    ',ar1.T)  # 一维数组转置之后不变
        print(ar2,'
    ',ar2.T)  # 二维数组转置之后行列互换
        
        [Out]:
        [0 1 2 3 4 5 6 7 8 9] 
         [0 1 2 3 4 5 6 7 8 9]
        [[1. 1.]
         [1. 1.]
         [1. 1.]
         [1. 1.]
         [1. 1.]] 
         [[1. 1. 1. 1. 1.]
        [1.1. 1. 1. 1.]]
        
        [In]:
        # reshape()方法
        ar3 = ar1.reshape(2,5)      # 直接将已有数组改变形状
        ar4 = np.zeros((4,6)).reshape(3,8)    # 生成数组后直接改变形状
        ar5 = np.reshape(np.arange(12),(3,4)) # 参数内添加数组和目标形状
        print(ar1,'
    ',ar3)
        print(ar4)
        print(ar5)
        
        [Out]:
        [0 1 2 3 4 5 6 7 8 9] 
         [[0 1 2 3 4]
         [5 6 7 8 9]]
        [[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  1  2  3]
         [ 4  5  6  7]
         [ 8  9 10 11]]
        
        [In]:
        # resize() 方法
        ar6 = np.resize(np.arange(5),(3,4))  
        # 生成5个元素,但却要生成3*4的矩阵,会重复这5个元素
        print(ar6)
        
        [Out]:
        [[0 1 2 3]
         [4 0 1 2]
         [3 4 0 1]]
        
        [In]:
        # 数组的复制
        ar1 = np.arange(10)
        ar2 = ar1
        print(ar2 is ar1)
        ar1[2] = 9         # 浅拷贝,源对象改变,复制对象也跟着改变
        print(ar1,ar2)
        
        [Out]:
        True
        [0 1 9 3 4 5 6 7 8 9] [0 1 9 3 4 5 6 7 8 9]
        
        [In]:
        ar3 = ar1.copy()
        print(ar3 is ar1)
        ar1[0] = 9
        print(ar1,ar3)
        print(id(ar1),id(ar2))
        
        [Out]:
        False
        [9 1 9 3 4 5 6 7 8 9] [9 1 9 3 4 5 6 7 8 9]
        2635020270208 2635020270208
        
        [In]:
        # 数组类型的转换 astype()
        ar1 = np.arange(10,dtype=float)
        print(ar1,ar1.dtype)
        [0.1. 2. 3. 4. 5. 6. 7. 8. 9.] float64
        [In]:
        ar2 = ar1.astype(np.int32)
        print(ar2,ar2.dtype)
        print(ar1,ar1.dtype)
        
        [Out]:
        [0 1 2 3 4 5 6 7 8 9] int32
        [0.1. 2. 3. 4. 5. 6. 7. 8. 9.] float64
        
        [In]:
        # 数组的堆叠
        a = np.arange(5)     # 生成0-4的一维数组
        b = np.arange(5,9)   # 生成5-9的一维数组
        ar1 = np.hstack((a,b)) # 将a、b两个数组横向堆叠(另vstack是纵向堆叠)
        print(a,a.shape)
        print(b,b.shape)
        print(ar1,ar1.shape)
        
        [Out]:
        [0 1 2 3 4] (5,)
        [5 6 7 8] (4,)
        [0 1 2 3 4 5 6 7 8] (9,)
        
        [In]:
        a = np.array([[1],[2],[3]])     # 生成3行1列的数组
        b = np.array([['a'],['b'],['c']])  # 生成3行1列的数组
        ar2 = np.hstack((a,b))      #将两个数组横向堆叠(数字数字与字符数组统一成字符型数组)
        print(a,a.shape)
        print(b,b.shape)
        print(ar2,ar2.shape)
        
        [Out]:
        [[1]
         [2]
         [3]] (3, 1)
        [['a']
         ['b']
         ['c']] (3, 1)
        [['1' 'a']
         ['2' 'b']
         ['3' 'c']] (3, 2)
        
        
        
        [In]:
        # numpy.stack(arrays,axis=0) 沿着新轴连接数组的序列,形状必须一样
        # 如[1 2 3]和[4 5 6],shape均为(3,0)
        # axis=0:[[1 2 3] [4 5 6]],shape为(2,3)
        # axis=1:[[1 4] [2 5] [3 6]],shape为(3,2)
        a = np.arange(5)
        b = np.arange(5,10)
        ar1 = np.stack((a,b))
        ar2 = np.stack((a,b),axis = 1)
        print(a,a.shape)
        print(b,b.shape)
        print(ar1,ar1.shape)
        print(ar2,ar2.shape)
        
        [Out]:
        [0 1 2 3 4] (5,)
        [5 6 7 8 9] (5,)
        [[0 1 2 3 4]
         [5 6 7 8 9]] (2, 5)
        [[0 5]
         [1 6]
         [2 7]
         [3 8]
         [4 9]] (5, 2)
        
        [In]:
        # 数组的拆分
        # numpy.hsplit(ary,indices_or_sections):将数组水平(逐行)拆分为多个子数组(按列拆分)
        # 输出结果为列表,列表中元素为数组
        ar = np.arange(16).reshape(4,4)
        ar1 = np.hsplit(ar,2)     		# 拆分为两列为一个数组
        print(ar)
        print(ar1,type(ar1))
        
        [Out]:
        [[ 0  1  2  3]
         [ 4  5  6  7]
         [ 8  9 10 11]
         [12 13 14 15]]
        [array([[ 0,  1],
               [ 4,  5],
               [ 8,  9],
               [12, 13]]), array([[ 2,  3],
               [ 6,  7],
               [10, 11],
               [14, 15]])] <class 'list'>
        [In]:
        # numpy.vsplit(ary,indices_or_sections):将数组垂直(行方向)拆分为多个子数组(按行拆分)
        ar2 = np.vsplit(ar,4)
        print(ar2,type(ar2))
        [Out]:
        [array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8,  9, 10, 11]]), array([[12, 13, 14, 15]])] <class 'list'>
        
        [In]:
        # 数组的简单运算
        ar = np.arange(6).reshape(2,3)
        print(ar + 10)
        print(ar * 2)
        print(1 / (ar+1))
        print(ar ** 0.5)
        
        [Out]:
        [[10 11 12]
         [13 14 15]]
        [[ 0  2  4]
         [ 6  8 10]]
        [[1.         0.5        0.33333333]
         [0.25       0.2        0.16666667]]
        [[0.         1.         1.41421356]
         [1.73205081 2.         2.23606798]]
        
        [In]:
        print(ar.mean()) # 均值
        print(ar.max())
        print(ar.min())
        print(ar.std())
        print(ar.var()) # 方差
        print(ar.sum(),np.sum(ar,axis = 0)) # axis为0,按列求和;axis为1,按行求和
        print(np.sort(np.array([1,5,2,3,7]))) #排序
        
        [Out]:
        2.5
        5
        0
        1.707825127659933
        2.9166666666666665
        15 [3 5 7]
        [1 2 3 5 7] 
  • 相关阅读:
    浏览器端-W3School-JavaScript:JavaScript Date 对象
    浏览器端-3WSchool-JavaScript:JavaScript Boolean 对象
    Error-ASP.NET:编译器错误消息: CS0016: 未能写入输出文件
    浏览器端-W3School-浏览器端:JavaScript Array 对象
    模板:目录
    Learning Lua Programming (2) Lua编程基础
    写Java程序要体现面向对象
    数据结构与算法 多种排序算法
    [置顶] 手机通过socket控制电脑关机,重启,注销等功能
    POJ 水题若干
  • 原文地址:https://www.cnblogs.com/jiazhongxin/p/12775203.html
Copyright © 2011-2022 走看看