zoukankan      html  css  js  c++  java
  • 掌握numpy(三)

    目录##

    掌握numpy(一)
    掌握numpy(二)
    掌握numpy(三)
    掌握numpy(四)

    统计功能##

    前面都是介绍numpy的一些特性,被称为数学运算神器怎么能少了统计功能呢

    ndarray的方法###

    a = np.array([[-2.5, 3.1, 7], [10, 11, 12]])
    >>print "mean =", a.mean()
    mean = 6.76666666667
    

    上面mean没有指定参数,是将ndarray中得所有值相加,求得均值

    >>a.mean(axis=1) #按行求均值
    array([  2.53,  11. ]) 
    >>a.mean(axis=0) #按列求均值
    array([ 3.75,  7.05,  9.5 ])
    

    上面数据是2维的,如果是多维度的怎么办呢?

    a = np.arange(24).reshape(2,3,4)
    >>a
    array([[[ 0,  1,  2,  3],
            [ 4,  5,  6,  7],
            [ 8,  9, 10, 11]],
           [[12, 13, 14, 15],
            [16, 17, 18, 19],
            [20, 21, 22, 23]]])
    >>a.sum(axis=0)
    array([[12, 14, 16, 18],# 12=(0+12)
           [20, 22, 24, 26],#20=(4+16)
           [28, 30, 32, 34]])
    >>a.sum(axis=1),
    array([[12, 15, 18, 21],#12=(0+4+8)
         [48, 51, 54, 57]])
    >>a.sum(axis=(0,2))
    array([ 60,  92, 124])#60=(0+1+2+3 + 12+14+15+16+18)
    

    下面是一些常用得数值统计方法

    for func in (a.min,a.max,a.prod,a.std,a.var):
       >> print func.__name__ ,"=",func()
    min = -2.5
    max = 12.0
    prod = -71610.0    #内积
    std = 5.08483584352
    var = 25.8555555556
    

    数值运算方法###

    NumPy还 提供了许多常用的数值运算方法,像数值运算中的绝对值、三角和函数、对数等等。这些方法都是element-wise

    a = np.array([[-2.5, 3.1, 7], [10, 11, 12]])
    for func in (np.abs, np.sqrt, np.exp, np.log, np.sign, np.ceil, np.modf, np.isnan, np.cos):
        print"
    ", func.__name__
        >>print(func(a))
    absolute #绝对值
    [[  2.5   3.1   7. ]
     [ 10.   11.   12. ]]
    
    sqrt
    [[        nan  1.76068169  2.64575131] #不满足运算法则的返回nan
     [ 3.16227766  3.31662479  3.46410162]]
    
    exp
    [[  8.20849986e-02   2.21979513e+01   1.09663316e+03]
     [  2.20264658e+04   5.98741417e+04   1.62754791e+05]]
    
    log
    [[        nan  1.13140211  1.94591015]
     [ 2.30258509  2.39789527  2.48490665]]
    
    sign
    [[-1.  1.  1.]
     [ 1.  1.  1.]]
    
    ceil #向上取整
    [[ -2.   4.   7.]
     [ 10.  11.  12.]]
    
    modf #返回的为一个元组=>(小数部分,整数部分)
    (array([[-0.5,  0.1,  0. ],
           [ 0. ,  0. ,  0. ]]), array([[ -2.,   3.,   7.],
           [ 10.,  11.,  12.]]))
    
    isnan
    [[False False False]
     [False False False]]
    
    cos
    [[-0.80114362 -0.99913515  0.75390225]
     [-0.83907153  0.0044257   0.84385396]]
    

    数组的index##

    一维数组###

    ndarray有着python原生数组的所有特性,例如切片(slice)

    a=np.arange(9)
    >>a
     array([0, 1, 2, 3, 4, 5, 6, 7, 8])
    >>a[2:5]
    array([2, 3, 4])
    >>a[2:-1]
    array([2, 3, 4, 5, 6, 7])
    >>a[:2]
     array([0, 1])
    >>a[::-1]
     array([8, 7, 6, 5, 4, 3, 2, 1, 0])
    

    当然还有原生数组没有的特性

    a[2:5]=-1
    >>a
    array([ 0,  1, -1, -1, -1,  5,  6,  7,  8])
    

    有几点需要注意的

    • 1.不能用以下方式增长或者缩减ndarray数组
    try:
        a[2:5] = [1,2,3,4,5,6]  # too long
    except ValueError as e:
        >>print(e)
    cannot copy sequence with size 6 to array axis with dimension 3
    
    • 2.不能删除ndarray数组元素 #原生数组可以
    try:
        del a[2:5]
    except ValueError as e:
       >>print(e)
    ValueError: cannot delete array elements
    
    • 3.修改切片数组的内容,原始数组值也发生变化
    b = a[3:5]
    b[0] = 999
    >>b
    array([999,   4])
    >>a
    array([  0,   1,   2, 999,   4,   5,   6,   7,   8])
    

    如果确定要拷贝数值,可以使用copy方法

    b = a[3:5].copy()
    b[0] = 999
    >>a
    array([0, 1, 2, 3, 4, 5, 6, 7, 8])
    b
    >>array([999,   4])
    

    多维数组###

    多维的ndarray有许多神奇的方法

    b = np.arange(24).reshape(4, 6)
    >>b
    array([[ 0,  1,  2,  3,  4,  5],
           [ 6,  7,  8,  9, 10, 11],
           [12, 13, 14, 15, 16, 17],
           [18, 19, 20, 21, 22, 23]])
    >>b[1,1] #等价与b[1][1]
    7
    >>b[1,:]#第一行的所有元素
    array([ 6,  7,  8,  9, 10, 11])
    >>b[:,1]#第一列的所有元素
    array([ 1,  7, 13, 19])
    

    注意:下面的两种写法的不同

    >>b[1,:]
    array([ 6,  7,  8,  9, 10, 11]) # (6L,)
    >>b[1:2,:] 
    array([[ 6,  7,  8,  9, 10, 11]])#(1L, 6L)
    

    如果我只想要多维度数组中的第一行和最后一行/列呢?

    >>b[(0,-1),:]
    array([[ 0,  1,  2,  3,  4,  5],
           [18, 19, 20, 21, 22, 23]])
    

    上面的写法等价于

    index = np.array([True,False,False,True])
    >>b[index,:]
    array([[ 0,  1,  2,  3,  4,  5],
           [18, 19, 20, 21, 22, 23]])
    

    np.ix_###

    上面学习了那么多的知识,我们来要给小测验:数组b中第1行和第3行中第4和第6列的元素([[3,5],[15,17]])该怎么表示呢?
    我猜你会这么写

    >>b[(0,2),(3,5)]
    array([ 3, 17]) 
    >>b[[0,2],[3,5]]
    array([ 3, 17])
    

    上面的结果显然不是我们想要的,那么正确的写法是什么呢?这时候就需要ix_方法

    index = np.ix_([0,2],[3,5])
    >>index
    (array([[0],
            [2]]), array([[3, 5]]))
    >>b[index]
    array([[ 3,  5],
           [15, 17]])
    

    ndarray的遍历##

    对数组的遍历是我们经常用的操作,对于numpy数组该由如何遍历呢?
    接着使用上面的数组b,

    for i in b:
        >>print 'row:',i
    row: [0 1 2 3 4 5]
    row: [ 6  7  8  9 10 11]
    row: [12 13 14 15 16 17]
    row: [18 19 20 21 22 23]
    

    如果想要遍历所有的元素呢

    for i in b.flat:
        >>print 'Element:',i
    Element: 0
    Element: 1
    Element: 2
    ....
    Element: 21
    Element: 22
    Element: 23
    
    
  • 相关阅读:
    JDBC链接mysql
    javac和java的使用
    PreparedStatement的execute误解
    sleep() 与 wait()的比较
    使用java程序模拟页面发送http的post请求
    《算法竞赛入门经典》6.1.2栈和队列-铁轨
    《算法竞赛入门经典》6.1栈和队列-卡片游戏
    《算法竞赛入门经典》5.42数学基础-因子和阶乘
    《算法竞赛入门经典》5.41数学基础-Cantor的数表
    qsort函数
  • 原文地址:https://www.cnblogs.com/wxshi/p/7858370.html
Copyright © 2011-2022 走看看