Numpy 模块基础学习

作者: 井底蛙蛙呱呱呱 | 来源:发表于2017-02-07 11:23 被阅读401次

    Numpy是Python的第第三方模块,用于科学计算。

    1.属性
    ndim  维度
    shape  行数和列数
    size  元素个数
    

    列表转化为数组:

    >>>import numpy as np
    >>>np.array(list(range(4))) #创建数组
    array([0,1,2,3])
    >>>a=np.array([list(range(1,4)),list(range(2,5))]) #创建数组
    >>>a
    array([[1, 2, 3],
           [2, 3, 4]])
    >>>a.dim
    2
    >>>a.shape
    (2,3)
    >>>a.size
    6
    
    2. array的创建
    • 指定数据类型dtype
    # 数据类型有几种:int64,int32,以及flaot,flaot32等,默认为int64
    >>>import numpy as np
    >>>a=np.array(list(range(4)),dtype=np.int(64))
    >>>a.dtype
    dtype('int64')
    
    • 创建一些特殊数组zeros,ones,empty,linspace,arange,reshape
    # 利用zeros可以创建元素全部为0的数组
    >>>import numpy as np
    >>>a=np.zeros((3,4)) # 创建3行4列元素全部为零的数组
    >>>a
    array([[ 0.,  0.,  0.,  0.],
           [ 0.,  0.,  0.,  0.],
           [ 0.,  0.,  0.,  0.]])
    >>>
    # 利用ones 创建元素全部为1的数组
    >>>b=np.ones((3,4))
    >>>b
    array([[ 1.,  1.,  1.,  1.],
           [ 1.,  1.,  1.,  1.],
           [ 1.,  1.,  1.,  1.]])
    >>>
    # empty 用来创建全空数组,元素值都接近于零(3.6版本元素直接都为零)
    >>>c=np.empty((3,4))
    >>>c
    array([[ 0.,  0.,  0.,  0.],
           [ 0.,  0.,  0.,  0.],
           [ 0.,  0.,  0.,  0.]])
    >>>
    # 利用arange创建连续数组,arange用法类似range
    >>>d=np.arange(12).reshape(3,4) #利用arange创建连续数组并用reshape改变数组行列数
    >>>d 
    array([[ 0,  1,  2,  3],
           [ 4,  5,  6,  7],
           [ 8,  9, 10, 11]])
    >>>
    # 利用linespace创建等差数据
    >>>e=np.linespace(1,20,10) #从1到20,分10份
    >>>e
    array([  1.        ,   3.11111111,   5.22222222,   7.33333333,
             9.44444444,  11.55555556,  13.66666667,  15.77777778,
            17.88888889,  20.        ])
    
    3. Numpy基础运算
    • 基本运算加减乘除,幂运算以及矩阵运算
    >>>import numpy as np
    >>>a=np.arange(10,41,10)  # 创建数组array([10, 20, 30, 40])
    >>>b=np.arange(4)  # 创建数组 array([0, 1, 2, 3])
    >>>a-b        #a,b 数组行列数相同,做减法运算
    array([10, 19, 28, 37])
    >>>a+b
    array([10, 21, 32, 43])
    >>>a*b
    array([  0,  20,  60, 120])
    >>>a**b        #以b数组中元素作为a数组中相应元素的幂做运算
    array([    1,    20,   900, 64000])
    >>>a**2   # 简单的幂运算
    array([ 100,  400,  900, 1600])
    >>>np.sin(a)
    array([-0.54402111,  0.91294525, -0.98803162,  0.74511316]) # 三角函数运算
    >>>a<20   #对数组中的值进行逻辑判断,返回一个bool值数组
    array([ True, False, False, False], dtype=bool)
    >>>
    # 矩阵乘法dot
    >>>np.dot(a,b)   #简单一维矩阵乘法
    200
    >>>d=np.arange(1,7).reshape(2,3)
    >>>e=np.arange(2,8).reshape(3,2)
    >>>np.dot(d,e)   #多维矩阵相乘
    array([[28, 34],
           [64, 79]])
    #  *表示矩阵点乘,如A*B表示A点乘B矩阵
    
    • 数组一些其他常用方法sum(),min(),max()
    >>>import numpy as np
    >>>a=np.random.random((2,4)) #生成1以内的随机数并创建2行4列的数组
    >>>a
    array([[ 0.67865178,  0.82898517,  0.19739667,  0.54224819],
           [ 0.74727939,  0.33392007,  0.32268768,  0.81595398]])
    >>>np.sum(a)
    4.4671229255139142
    >>>np.min(a)
    0.19739667308187692
    >>>np.max(a)
    0.82898516901089903
    >>>
    # 如果仅需要对列或者行进行上述操作,可以加入axis参数,
    # axis=0表示对行进行操作,axis=1表示对列进行操作
    >>>np.sum(a,axis=1)
    array([ 2.24728181,  2.21984112])
    
    • 另一些常用方法
    argmin()    #寻找数组中最小值的索引,支持axis参数
    argmax() #寻找数组中最大值的索引,支持axis参数
    mean()       #求平均值
    average() #也是求平均值
    median()     #求中位数. [1,4,5,6]中位数是4.5,平均值是4
    cumsum()   #累加,[1,2,3,4]结果为[1,3,6,10]
    diff()           #类似累差,如[1,4,5,6]结果为[3,1,1]
    nonezero   # 返回非零元素的坐标
    sort()        #排序,同样也支持axis
    transpose() #转置,array.T也可以达到相同的效果
    clip(array,array_min,array_max)  #将矩阵中比array_min小的元素变成array_min,将矩阵中比array_max大的元素变成array_max
    

    一些例子

    >>>import numpy as np
    >>>a=np.arange(12,0,-1).reshape(3,4)
    >>>a
    array([[12, 11, 10,  9],
           [ 8,  7,  6,  5],
           [ 4,  3,  2,  1]])
    >>>np.argmin(a)    # 最小值索引
    11
    >>>np.argmax(a) # 最大值索引
    0
    >>>np.mean(a)
    6.5
    >>>np.average(a)
    6.5
    >>>np.median(a)    # 偶数个元素无中位数取中位数两边值的平均值,奇数个元素直接取中间元素的值
    6.5
    >>>np.cumsum(a)
    array([12, 23, 33, 42, 50, 57, 63, 68, 72, 75, 77, 78]
    >>>np.diff(a)
    array([[-1, -1, -1],
           [-1, -1, -1],
           [-1, -1, -1]])
    >>>np.sort(a)
    array([[ 9, 10, 11, 12],
           [ 5,  6,  7,  8],
           [ 1,  2,  3,  4]])
    >>>np.transpose(a)
    array([[12,  8,  4],
           [11,  7,  3],
           [10,  6,  2],
           [ 9,  5,  1]])
    >>>a.T
    array([[12,  8,  4],
           [11,  7,  3],
           [10,  6,  2],
           [ 9,  5,  1]])
    >>>np.clip(a,4,9)
    array([[9, 9, 9, 9],
           [8, 7, 6, 5],
           [5, 5, 5, 5]])
    
    4. 索引与切片

    数组索引与字符串列表中的索引用法类似

    import numpy as np
    # 对于一维数组,索引与string,list一样
    >>>a=np.arange(12,0,-1)
    >>>a
    [12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
    >>>a[1]
    12
    >>>
    # 对于二维数组乃至多维数组索引类似与列表中嵌套列表的索引方式
    >>>b=np.arange(12,0,-1).reshape(3,4)
    >>>b
    array([[12, 11, 10,  9],
           [ 8,  7,  6,  5],
           [ 4,  3,  2,  1]])
    >>>b[1][1]
    7
    

    数组中的切片与列表字符串小有差别,与R语言中的矩阵相差无异

    >>>b=np.arange(12,0,-1).reshape(3,4)
    >>>b
    array([[12, 11, 10,  9],
           [ 8,  7,  6,  5],
           [ 4,  3,  2,  1]])
    >>>b[1,1:3]  # 第二行的第一列第二列
    array([7, 6])
    

    flat是一个数组中的迭代器,flatten()函数进行降维操作,将多维数组降为一维数组

    >>>b.flatten()
    array([12, 11, 10,  9,  8,  7,  6,  5,  4,  3,  2,  1]
    
    5. 数组的合并

    简单的数组合并使用vstack()hstack()即可,而对于复杂的合并使用concatenate()则更简单。

    >>>import numpy as np
    >>>a=np.array([1,1,1])
    >>>b=np.array([2,2,2])
    >>>np.vstack((a,b))    # vstack()进行纵向合并,也即堆叠
    array([[1, 1, 1],
           [2, 2, 2]])
    >>>np.hstack(a,b)  # hstack()进行横向合并
    array([1, 1, 1, 2, 2, 2])
    

    对于一维数组,无法进行转置,需要先进行一些改变

    >>>import numpy as np
    >>>a=np.array([1,1,1])[np.newaxis,:]     # 1行3列
    >>>a.shape
    (1,3)
    >>>b=np.array([2,2,2])[:,np.newaxis]   # 3行1列
    >>>b.shape
    (3,1)
    >>>np.vstack((b,b))
    array([[2],
           [2],
           [2],
           [2],
           [2],
           [2]])
    

    要合并多个矩阵或者序列时,则用concatenate会更方便

    >>>import numpy as np
    >>>a=np.array([1,1,1])[:,np.newaxis]
    >>>b=np.array([2,2,2])[:,np.newaxis]
    >>>np.concatenate((a,b,b,a),axis=0)   # axis=0 表示按行堆叠纵向合并
    array([[1],
           [1],
           [1],
           [2],
           [2],
           [2],
           [2],
           [2],
           [2],
           [1],
           [1],
           [1]])
    >>>np.concatenate((a,b,b,a),axis=1)  # axis=1表示横向以增加列的方式合并
     array([[1, 2, 2, 1],
           [1, 2, 2, 1],
           [1, 2, 2, 1]])
    
    6. 分割

    数组中常用split()以及array_split()进行等量以及不等量分割,分割后的部分可以采用索引的方式取出想要的部分。

    >>>import numpy as np
    >>>a=np.arange(12).reshape((3,4))
    >>>a
    array([[ 0,  1,  2,  3],
           [ 4,  5,  6,  7],
           [ 8,  9, 10, 11]])
    >>>
    # 利用np.split()进行等量分割
    >>>np.split(a,3,axis=0)  # 将a分成几行
    [array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8,  9, 10, 11]])]
    >>>np.split(a,2,axis=1)  #将a按列分成2半,每部分2列
    [array([[0, 1],
            [4, 5],
            [8, 9]]), array([[ 2,  3],
            [ 6,  7],
            [10, 11]])]
    >>>
    # 利用np.array_split()进行不等量分割
    >>>np.array_split(a,3,axis=1)  # 将a按列分成2,1,1三列
    [array([[0, 1],
            [4, 5],
            [8, 9]]), array([[ 2],
            [ 6],
            [10]]), array([[ 3],
            [ 7],
            [11]])]
    >>>np.array_split(a,2,axis=0)   # 将a按行分成2,1两部分
    [array([[0, 1, 2, 3],
            [4, 5, 6, 7]]), array([[ 8,  9, 10, 11]])]
    

    其他的分割方式:np.vsplit()np.hsplit()np.vsplit()即纵向按行分割,np.hsplit()即横向按列分割。但是这两种分割方式都不支持不等量分割。

    >>>import numpy as np
    >>>a=np.arange(12).reshape((3,4))
    >>>np.hsplit(a,2)    # 相当于np.split(a,2,axis=1),按列分割
    [array([[0, 1],
            [4, 5],
            [8, 9]]), array([[ 2,  3],
            [ 6,  7],
            [10, 11]])]
    >>> np.vsplit(a,3)  # 相当于np.split(a,3,axis=0),按行分成三行
    [array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8,  9, 10, 11]])]
    
    7. 数组的copy与deep copy

    数组的复制与list复制方式类似,分浅复制与深度复制,简单的复制是使几个变量指向同一个指针,因此这几个变量中的一个改变,其余的几个也会跟着改变,而deep copy方式是将一个变量的值赋给另一个变量,两者指向不同的指针,只是值相同。

    >>>import numpy as np
    >>>a=np.arange(4)
    >>>a
    array([0, 1, 2, 3])
    >>>b=a
    >>>c=b
    >>>d=c       # a,b,c,d四个变量指向同一个地址
    >>>e=a.copy() # 将a的值赋给e,两者指向不同的地址
    >>>a[3]=10
    >>>a
    array([ 0,  1,  2, 10])
    >>>b
    array([ 0,  1,  2, 10])
    >>>e
    array([0, 1, 2, 3])
    

    奇怪的是当使用[:]的复制方式时与列表复制出现了不同的结果,列表中的[:]与copy复制效果是相同的,而在数组中却出现了不同,数组中[:]复制的两个变量的变化仍然保持一致性

    >>>import numpy as np
    >>>a=np.arange(4)
    >>>b=a
    >>>c=a[:]
    >>>d=a.copy()
    >>>a[3]=10
    >>>id(a)
    140572616448320
    >>>id(b)
    140572616448320         # a,b的指针地址相同
    >>>id(c)
    140572616446080
    >>>id(d)
    140572616448640 
    >>>a
    array([ 0,  1,  2, 10])
    >>>b
    array([ 0,  1,  2, 10])
    >>>c
    array([ 0,  1,  2, 10]) # a,c的指针地址不同,变化却是一致的
    >>>d
    array([0, 1, 2, 3])
    

    相关文章

      网友评论

        本文标题:Numpy 模块基础学习

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