zoukankan      html  css  js  c++  java
  • Numpy

    Numpy是python语言的一个扩充程序库,支持高级大量的维度数组与矩阵运算,此外也针对数组运算提供了大量的数学函数库。

    基本功能:

    快速高效的多位数组对象ndarray

    用于对数组执行元素级计算以及直接对数组执行数学运算的函数

    用于读写硬盘还是那个基于数组的数据集的工具

    线性代数运算,傅里叶变换,以及随机数生成

    用于将C,C++,Fortran代码集成到python的工具

    除了为python提供快速的数组处理能力,Numpy在数据分析方面还有另外一个主要作用,即作为在算法之间传递数据的容器

    Numpy提供常用的数值数组,矩阵等函数

    优点:

    是基于向量化的运算

    进行数值运算时Numpy数组比list效率高

    >>> import numpy as np
    >>> np.arange(10)
    array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) #10个元素的数组,()
    >>> list(np.arange(10))
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] #10个元素的列表,[] 数组转列表      

    Scipy

    是一种使用Numpy来做高等数学,信号处理,优化,统计的扩展包

    >>> from  scipy import linalg ##线性代数的包引入
    >>> a=np.array([[1,2],[3,5]]) #定义一个二维的数组
    >>> a
    array([[1, 2],#第一行元素是1和2
           [3, 5]])#第二张元素是3和5
    >>> linalg.det(a)#行列式的值,1*5-2*3
    -1.0

     数据类型:使用astype将float类型转化为int的类型

    >>> arr=np.array([1,2,4],dtype=np.float64)#指定数据类型
    >>> print(arr.dtype)
    float64
    >>> float=arr.astype(dtype=np.int)#转化为指定的数据类型
    >>> print(float.dtype)
    int32

    数组运算(加减乘除)

    >>> a=np.array([[1,3,4,5],[2,4,5,5]])
    >>> print(a*a)
    [[ 1  9 16 25]
     [ 4 16 25 25]]
    >>> print(a-a)
    [[0 0 0 0]
     [0 0 0 0]]
    >>> print(a+a)
    [[ 2  6  8 10]
     [ 4  8 10 10]]
    >>> print(1/a)#标量操作作用在数组的每个元素上
    [[1.         0.33333333 0.25       0.2       ]
     [0.5        0.25       0.2        0.2       ]]

    对更高维度的数组的访问和操作

    >>> b = np.array([[[1,2,3],[3,4,5]],[[4,4,2],[3,2,3]]])
    >>> b[0][1]
    array([3, 4, 5])
    >>> b[1]
    array([[4, 4, 2],
           [3, 2, 3]])
    >>> c = b[0].copy()#进行复制copy
    >>> print(c)
    [[1 2 3]
     [3 4 5]]
    >>> print(c)
    [[1 2 3]
     [3 4 5]]
    >>> print(c[0])
    [1 2 3]
    >>> print(c[0,1])#访问方式
    2
    >>> print(c[0][1])
    2

    如果是,的话代表的是对多维数组的访问和操作,如果是:代表的是当前维度数组的同级操作

    切片操作:

    >>> d=np.array([1,4,543,2,2,2,4,24,2])
    >>> print(d[:3])
    [  1   4 543]
    >>> print(d[3:5])
    [2 2]
    >>> print(d[5:])
    [ 2  4 24  2]
    >>> print(a)#对多维数组的访问和操作
    [[1 3 4 5]
     [2 4 5 5]]
    >>> print(a[1,1])#访问的是第二个数组,第一列的数值
    4
    >>> print(a[1,1:])#访问的是第二个数组,第一列之后的数值
    [4 5 5]
    >>> print(a[:1,1:])#访问的是第二个数组之前就是第一个数组,第一列之后的值(包括第一列)
    [[3 4 5]]
    >>> import numpy as np
    >>> import numpy.random as np_random
    >>> name_arr=np.array(['bob','joe','will','bob'])
    >>> print(name_arr)
    ['bob' 'joe' 'will' 'bob']
    >>> print(name_arr=='bob')
    [ True False False  True]
    >>> rnd_arr=np_random.randn(7,4)#随机7*4数组
    >>> print(rnd_arr)
    [[ 1.44479013  0.30643889  1.02635006 -0.06523054]
     [ 0.21681768 -0.22394964 -0.8573446  -1.34709504]
     [-1.14918202 -1.58816338  0.22967305  1.19319723]
     [ 0.17709409 -0.05995874 -0.53326976 -1.03580977]
     [-0.87692579 -0.45278675  0.3785352  -1.40043334]
     [ 0.06633862 -0.17220636 -0.02320015  1.34064211]
     [-2.06230887  0.75262294 -0.27911745  0.10554469]]

    转置数组

    >>> arr=np.arange(15).reshape((3,5))
    >>> print(arr)
    [[ 0  1  2  3  4]
     [ 5  6  7  8  9]
     [10 11 12 13 14]]
    >>> print(arr.T)
    [[ 0  5 10]
     [ 1  6 11]
     [ 2  7 12]
     [ 3  8 13]
     [ 4  9 14]]

    numpy的ndarray花式索引

    花式索引是一个numpy术语,他指的是利用整数数组进行索引

    一次传入多个索引数组会有一点特别,他返回的是一个一维数组,其中的元素对应各个索引元祖

    >>> a=np.array([2,5,6,75,4,4])
    >>> print(a)
    [ 2  5  6 75  4  4]
    >>> print(a[[3,2,1]])##根据对应的索引进行查找[[]]
    [75  6  5]
    >>> print(a[[-2,-5,-1]])
    [4 5 4]
    >>> arr=np.arange(32).reshape((4,8))##二维数组
    >>> print(arr)
    [[ 0  1  2  3  4  5  6  7]
     [ 8  9 10 11 12 13 14 15]
     [16 17 18 19 20 21 22 23]
     [24 25 26 27 28 29 30 31]]
    >>> print(arr[[0,1,2,3],[1,5,3,6]])##找到对应的索引,哪行那列
    [ 1 13 19 30]
    >>> print(arr[[0,1,2,3]][:,[0,4,6,2]])#前面对应的行数都有的列数
    [[ 0  4  6  2]
     [ 8 12 14 10]
     [16 20 22 18]
     [24 28 30 26]]

    可读性更好的写法,np.ix_

    >>> print(arr[np.ix_([0,1,2,3],[2,3,1,4])])
    [[ 2  3  1  4]
     [10 11  9 12]
     [18 19 17 20]
     [26 27 25 28]]

    高维矩阵转换

    >>> arr=np.arange(16).reshape((2,2,4))
    >>> print(arr)
    [[[ 0  1  2  3]
      [ 4  5  6  7]]
    
     [[ 8  9 10 11]
      [12 13 14 15]]]
    >>> print(arr.transpose((1,0,2))##相当于是arr[x][y][z]=arr[y][x][z]
    ... )
    [[[ 0  1  2  3]
      [ 8  9 10 11]]
    
     [[ 4  5  6  7]
      [12 13 14 15]]]

    通过真值表选择元素

    >>> import numpy as np
    >>>
    >>> x_arr=np.array([1.1,1.2,1.3,1.4,1.5])
    >>> y_arr=np.array([2.1,2.2,2.3,2.4,2.5])
    >>> cond=np.array([True,False,True,True,False])
    >>> print(np.where(cond,x_arr,y_arr)
    ... )#where的用法,如果条件符合cond的话就选择x_arr,否则的话就选择y_arr
    [1.1 2.2 1.3 1.4 2.5]
    >>> result=[(x if c else y)  for  x,y,c in zip(x_arr,y_arr,cond)]
    >>> print(result)##列表推导式,if cond就选择x,否则y
    [1.1, 2.2, 1.3, 1.4, 2.5]

    求和求平均

    >>> import numpy.random as np_random
    >>> a=np.random.randn(5,3)
    >>> print(a)
    [[-0.4793828  -1.88543369 -0.83255275]
     [-0.54435772  0.87330253  0.30212139]
     [-1.0161385  -0.12159845  0.68038966]
     [ 0.36880324  0.52197493 -0.65248151]
     [-0.48323991 -1.30866231  0.97144494]]
    >>> print(a.mean())####求平均
    -0.24038739670967324
    >>> print(a.sum())##求和
    -3.6058109506450986
    >>> print(a.mean(axis=1))#对每一行进行求平均
    [-1.06578975  0.2103554  -0.1524491   0.07943222 -0.27348576]
    >>> print(a.sum(axis=0))##对每一列进行求和,axis可以省略
    [-2.15431569 -1.92041699  0.46892174]

    矩阵乘法

    >>> import numpy.random as np_random
    >>> from  numpy.linalg import  inv,qr
    >>> x=np.array([[1.,2.,3.],[4.,5.,6.]])
    >>> print(x)
    [[1. 2. 3.]
     [4. 5. 6.]]
    >>> y=np.array([[3.,5.],[3.,5.],[5.,6.]])
    >>> print(x.dot(y))##结果是【1*3+2*3+3*6,1*5+2*5+3*6】
    [[24. 33.]
     [57. 81.]]

     >>> print(np.dot(x,np.ones(3)))
     [ 6. 15.]

    reshape重塑数组

    >>> arr=np.arange(8)
    >>> print(arr)
    [0 1 2 3 4 5 6 7]
    >>> print(arr.reshape((2,4))##一维数组可以转化为二维数组
    ... )
    [[0 1 2 3]
     [4 5 6 7]]
    >>> print(arr.reshape((2,4)).reshape((4,2))#支持链式操作
    ... )
    [[0 1]
     [2 3]
     [4 5]
     [6 7]]
  • 相关阅读:
    关于读者来信的一些思考
    serializeArray()与serialize()的区别
    懒人代码-顶部栏
    $.ajax()方法详解
    JavaScript(js)对象常用操作,JS操作JSON总结
    js 获取手机浏览器类型,修改css文件的class的值
    阻止在极短的时间重复执行某个函数
    android WebViewClient和WebChromeClient
    java枚举使用详解
    android-async-http
  • 原文地址:https://www.cnblogs.com/yunxintryyoubest/p/11657769.html
Copyright © 2011-2022 走看看