zoukankan      html  css  js  c++  java
  • Numpy 基础学习

    Numpy是python科学计算的基础包,为python提供快速的数组处理能力,也可以作为在算法之间传递数据的容器

    安装相关软件包

    安装需要的包

    pip3 install numpy/pandas/mtaplotlib/ipython/scipy/xlrd/lxml/basemap/pymogo/PyQt/statsmodels/PyTables

    验证ipython

    Numpy

    NumPy的主要对象是同质多维数组。它是一张表,所有元素(通常是数字)的类型都相同,并通过正整数元组索引。在NumPy中,维度称为轴。轴的数目为秩rank。

    ndarray 是一个数据多维容器,所以,其中所有的元素类型必须是相同的,每个数组都有一个shape(一个表示各维度大小的元组)和一个dtype(一个用于说明数组数据类型的对象)

     

    Numpy的ndarray:一种多维数组对象

    例如:

    3D空间中的点的坐标[1, 2, 1]是rank为1的数组,因为它具有一个轴。该轴的长度为3。在下面所示的示例中,数组的rank为2(它是2维的)。

    第一维度(轴)的长度为2,第二维度的长度为3。
    [[ 1., 0., 0.],[ 0., 1., 2.]]

    NumPy的数组的类称为ndarray。别名为array

    实例代码与说明:

    In [48]: import numpy as np
    
    In [49]: a = np.arange(15).reshape(3,5)  #reshape可以理解为设置维度,3行5列
    
    In [50]: a
    Out[50]: 
    array([[ 0, 1, 2, 3, 4],
    [ 5, 6, 7, 8, 9],
    [10, 11, 12, 13, 14]])

    数组的维度shape。这是一个整数的元组,表示每个维度中数组的大小。

    对于具有n行和m列的矩阵,shape将是(n,m)。 因此,shape元组的长度就是rank或维度的个数ndim。

    In [51]: a.shape 
    Out[51]: (3, 5)
    
    In [52]: a.ndim    ##数组的轴(维度)的个数。在Python中,维度的数量被称为rank。
    Out[52]: 2
    
    In [58]: a.size    ##数组元素的总数。这等于shape的元素的乘积。
    Out[58]: 15
    
    ##数组中每个元素的字节大小。例如,元素为float64类型的数组的itemsize为8(=64/8),而complex32类型的数组的comitemsize为4(=32/8)。它等于ndarray.dtype.itemsize。
    In [53]: a.itemsize    
    Out[53]: 8
    
    In [54]: type(a)
    Out[54]: numpy.ndarray
    
    In [55]: b = np.array([6,7,8])
    
    In [56]: b
    Out[56]: array([6, 7, 8])

     创建数组

    创建数组最简单的方法用array函数,array函数会为数组推断出一个合适的数据类型,数据类型保存在dtype对象中,例如

    In [4]: data = [5,3,11,2.3,0]
    
    In [5]: arr1 = np.array(data)
    
    In [6]: arr1
    Out[6]: array([  5. ,   3. ,  11. ,   2.3,   0. ])
    
    In [7]: data2 = [[1,2,4,5],[5,6,7,8]]
    
    In [8]: arr2 = np.array(data2)
    
    In [9]: arr2
    Out[9]:
    array([[1, 2, 4, 5],
           [5, 6, 7, 8]])
    
    In [10]: arr1.dtype
    Out[10]: dtype('float64')
    
    In [11]: arr2.dtype
    Out[11]: dtype('int32')

    python内置函数range函数的数组版arange

    In [12]: np.arange(15)
    Out[12]: array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14])

     ndarray的数据类型 dtype

    dtype 用于说明数组数据类型的对象

    dtype含有ndarray将一块内存解释为特定数据类型所需的信息,语法

    arr3 = np.array([数组],dtype=np.float64)        #数组类型

    通过astype方法转化dtype

    arr1 = np.array([5,3,11,2.3,0])
    float_arr = arr1.astype(np.float64)

    如果数组元素都为字符串可用astype转换为数值类型,调用astype会创建出一个新的数组,即使新数组和老数组dtype相同

    如果浮点型数组转换为整数,小数点后面的将会被截断,并且不会四舍五入

    数组间的转换

    
    数组A = 。。
    数组B = 。。
    数组A.astype(数组B.dtype)

    数组运算(矢量化)

    数组与标量的算数运算应用到每个值

    In [13]: arr1
    Out[13]: array([  5. ,   3. ,  11. ,   2.3,   0. ])
    
    In [14]: arr1 * arr1
    Out[14]: array([  25.  ,    9.  ,  121.  ,    5.29,    0.  ])
    
    In [15]: arr1 - arr1
    Out[15]: array([ 0.,  0.,  0.,  0.,  0.])
    
    In [16]: 1 / arr1
    C:Program FilesPython35Scriptsipython3:1: RuntimeWarning: divide by zero encountered in true_divide
    Out[16]: array([ 0.2       ,  0.33333333,  0.09090909,  0.43478261,         inf])
    
    In [17]: 1 / arr1 ** 0.5
    C:Program FilesPython35Scriptsipython3:1: RuntimeWarning: divide by zero encountered in true_divide
    Out[17]: array([ 0.4472136 ,  0.57735027,  0.30151134,  0.65938047,         inf])
    
    In [18]:

    索引和切片

    一维数组

    In [25]: arr = np.array([4,3,6,7,2,7,9,8])      #一维数组与python的列表取值方式一样
    
    In [26]: arr
    Out[26]: array([4, 3, 6, 7, 2, 7, 9, 8])
    
    In [27]: arr[0]
    Out[27]: 4
    
    In [28]: arr[1]
    Out[28]: 3
    
    In [29]: arr[3:6]            #取值索引为 3,4,5的值
    Out[29]: array([7, 2, 7])
    
    In [30]: arr[3:6] = 11          #赋值为所有
    
    In [31]: arr
    Out[31]: array([ 4,  3,  6, 11, 11, 11,  9,  8])

    二维数组

    各索引位置上的值不再是一个标量,而是一个一维数组(python里的列表)

    In [33]: arr2d = np.array([[1,2,3],[4,5,6],[7,8,9]])  #shape为(3,3)
    In [
    34]: np.ndim(arr2d)      #二维数组查看方法 Out[34]: 2 In [35]: arr2d[2] Out[35]: array([7, 8, 9])

    所以,可以对单个元素进行递归访问

    In [35]: arr2d[2]
    Out[35]: array([7, 8, 9])
    
    In [36]: arr2d[2][0]
    Out[36]: 7

    二维数组索引方式

    多维数组索引

    In [37]: arr3d = np.array([[[1,2,3],[4,5,6]],[[7,8,9,],[10,11,12]]])
    
    In [38]: arr3d
    Out[38]:
    array([[[ 1,  2,  3],
            [ 4,  5,  6]],
    
           [[ 7,  8,  9],
            [10, 11, 12]]])
    
    In [39]: arr3d[0]              #取第一个值
    Out[39]:
    array([[1, 2, 3],
           [4, 5, 6]])
    
    In [40]: arr3d[0] = 42          #给元素赋值
    
    In [41]: arr3d[0]
    Out[41]:
    array([[42, 42, 42],
           [42, 42, 42]])
    
    In [42]: arr3d              #新的数组
    Out[42]:
    array([[[42, 42, 42],
            [42, 42, 42]],
    
           [[ 7,  8,  9],
            [10, 11, 12]]])
    
    In [43]: arr3d[1,0]          #多维数组元素取值,等同于 arr3d[1][0]
    Out[43]: array([7, 8, 9])

    切片索引

    二维数组切片

    ndarry的切片语法跟python列表的取值差不多,例

    In [45]: arr2d
    Out[45]:
    array([[1, 2, 3],
           [4, 5, 6],
           [7, 8, 9]])
    
    In [46]: arr2d[:2]
    Out[46]:
    array([[1, 2, 3],
           [4, 5, 6]])
    
    #一次传入多个切片取值

     In [47]: arr2d[:2,1:]        #取前两行的值,再取其索引为1及以后的值
     Out[47]:
     array([[2, 3],
          [5, 6]])

      #对高维数组切片

      arr2d[:,:1]        #算作是语法

    布尔型索引

    布尔型数组可用于数组索引,布尔型数组的长度必须与被索引的轴的长度一致

    In [48]: names = np.array(['Bob','Joe','will','Bob','will','Joe','Joe'])
    
    In [49]: data = randn(7,4)
    
    In [50]: names
    Out[50]:
    array(['Bob', 'Joe', 'will', 'Bob', 'will', 'Joe', 'Joe'],
          dtype='<U4')
    
    In [51]: data
    Out[51]:
    array([[ 0.10178629, -1.07043495,  0.39996302,  0.86182796],
           [-0.4353786 , -0.03595137, -0.50582915,  0.72286381],
           [-0.08335713, -0.88924282, -0.34335741, -1.11461641],
           [-0.69570247,  2.41029154, -0.62120433, -0.54820488],
           [-0.56408913, -0.43663855,  0.00482595,  0.36397724],
           [-0.32140443, -1.84666651,  0.11527445, -2.36827836],
           [-1.72703212,  0.13889588,  0.93259899, -0.92023785]])

     

     In [57]: names == 'Bob'
     Out[57]: array([ True, False, False, True, False, False, False], dtype=bool)

     In [58]: data[names=='Bob']      #根据名称的索引取data里的值
     Out[58]:
     array([[ 0.10178629, -1.07043495, 0.39996302, 0.86182796],
        [-0.69570247, 2.41029154, -0.62120433, -0.54820488]])

     In [59]: data[names=='Bob',2:]    #取值,与切片整数混合使用
     Out[59]:
     array([[ 0.39996302, 0.86182796],
         [-0.62120433, -0.54820488]])

     

     #选择非值操作,可使用!= 或者 - 符号表示非值,例:

     In [62]: names != 'Bob'

      Out[62]: array([False, True, True, False, True, True, True], dtype=bool)

     In [64]: data[-(names == 'Bob')]

     Out[64]:
     array([[-0.4353786 , -0.03595137, -0.50582915, 0.72286381],
      [-0.08335713, -0.88924282, -0.34335741, -1.11461641],
      [-0.56408913, -0.43663855, 0.00482595, 0.36397724],
      [-0.32140443, -1.84666651, 0.11527445, -2.36827836],
      [-1.72703212, 0.13889588, 0.93259899, -0.92023785]])

     #将data中的负值设置为0

     In [69]: data[data<0]
     Out[69]:
     array([-1.07043495, -0.4353786 , -0.03595137, -0.50582915, -0.08335713,
        -0.88924282, -0.34335741, -1.11461641, -0.69570247, -0.62120433,
        -0.54820488, -0.56408913, -0.43663855, -0.32140443, -1.84666651,
        -2.36827836, -1.72703212, -0.92023785])

     In [70]: data[data<0] = 0

     In [71]: data
     Out[71]:
     array([[ 0.10178629, 0. , 0.39996302, 0.86182796],
        [ 0. , 0. , 0. , 0.72286381],
        [ 0. , 0. , 0. , 0. ],
        [ 0. , 2.41029154, 0. , 0. ],
        [ 0. , 0. , 0.00482595, 0.36397724],
        [ 0. , 0. , 0.11527445, 0. ],
        [ 0. , 0.13889588, 0.93259899, 0. ]])

     In [72]:

     #通过一维布尔数组设置正行或整列的值

     In [74]: data[names != 'Joe'] = 0

     In [75]: data
     Out[75]:
     array([[ 0. , 0. , 0. , 0. ],
        [ 0. , 0. , 0. , 0.72286381],
        [ 0. , 0. , 0. , 0. ],
        [ 0. , 0. , 0. , 0. ],
        [ 0. , 0. , 0. , 0. ],
        [ 0. , 0. , 0.11527445, 0. ],
        [ 0. , 0.13889588, 0.93259899, 0. ]])

     In [76]:

    花式索引

    花式索引是利用整数进行索引

    一次性传入多个索引数组

     

    数组转置和轴对换

    通用函数

  • 相关阅读:
    NOIP 2011 DAY 2
    NOIP 2011 DAY 1
    扩展欧几里得算法(exgcd)
    中国剩余定理
    线性同余方程的求解
    乘法逆元
    poj 1845 Sumdiv(约数和,乘法逆元)
    欧拉-费马小定理定理(证明及推论)
    求解范围中 gcd(a,b)== prime 的有序对数
    KindEditor解决上传视频不能在手机端显示的问题
  • 原文地址:https://www.cnblogs.com/FRESHMANS/p/8490857.html
Copyright © 2011-2022 走看看