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

      Numpy(Numerical Python的简称)是高性能科学计算和数据分析的基础包。

      主要的功能:

        1、ndarray,一个具有矢量运算和复杂广播工能的快速且节省空间的多维数组

        2、用于对整组数据进行快速运算的标准数据函数(无需编写循环)

        3、用于读写磁盘数据的工具以及用于操作内存映射文件的工具

        4、线性代数、随机数生成以及傅里叶变换功能

        5、用于集成由C、C++、Fortran等语言编写的代码的工具

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

        numpy最重要的特点:

          1、其N维数组对象(ndarray)

          2、是一个快速灵活的大数据容器

          3、可以利用这种数组对整块数据进行数学运算,其语法和标量元素之间的运算一样

          4、ndarray中的所有元素必须是相同类型的。每个数组都有一个shape(表示各维度大小的元祖)和dtype(说明数组数据的对象)

      1.1 ndarray的创建 

     1 import numpy as np
     2 
     3 data = [1,2,3,4]
     4 '''
     5 array([1, 2, 3, 4])
     6 '''
     7 arr = np.array(data)
     8 
     9 #1
    10 arr.ndim  # 数组维度
    11 
    12 #(4,)
    13 arr.shape  # 数组各维度大小的元祖
     1 import numpy as np
     2 
     3 #额外能创建ndarray的方法
     4 
     5 np.zeros(10)  # 创建指定长度形状的数组, 全0
     6 np.zeros((3,2))
     7 np.zeros((1,2,3))
     8 
     9 np.ones()   # 创建指定长度形状的数组, 全1
    10 
    11 np.empty((2,3,2))  # 创建没有任何具体值的数组

      1.2 ndarray的数据类型

        Numpy的数据类型

    类型 说明
    int8、uint8 有符号和无符号的8位(一个字节)整型
    int16、uint16 有符号和无符号的16位(两个个字节)整型
    int32、uint32 有符号和无符号的32位(三个字节)整型
    int64、uint64 有符号和无符号的64位(四个字节)整型
    float16 半精度浮点数
    float32 标准的单精度浮点数。与C的float兼容
    float64 标准的双精度浮点数。与C的double和Python的float对象兼容
    float128 扩展精度浮点数
    complex64、complex128 分别用两个32位 、64位或128位浮点数表示的复数
    bool           存储Ture和Flase值的布尔类型
    object Python对象类型
    String_   固定长度的字符串类型
    Unicode_ 固定长度的Unicode类型(字节数由平台决定)

        dtype是一个特殊的对象,它含有ndarray将一块内存解释为特定数据类型所需的信息。

    1 import numpy  as np
    2 
    3 arr = np.array([1,2,3], dtype=np.float64)
    4 arr.dtype
    5 
    6 arr.astype(np.float32)  # 转换为dtype

      二、数组和标量之间的运算

        大小相等的数组之间的任何算术运算都会将运算应用到元素级别

     1 import numpy as np
     2 
     3 arr1 = np.array([[1,2,3],[3,4,5]])
     4 arr2 = np.array([[6,7,8],[9,10,11]])
     5 
     6 '''
     7 array([[ 7,  9, 11],
     8        [12, 14, 16]])
     9 '''
    10 arr1 + arr2
    11 
    12 
    13 '''
    14 array([[-5, -5, -5],
    15        [-6, -6, -6]])
    16 '''
    17 arr1 - arr2
    18 
    19 '''
    20 array([[ 6, 14, 24],
    21        [27, 40, 55]])
    22 '''
    23 arr1 * arr2
    24 
    25 '''
    26 array([[ 0.16666667,  0.28571429,  0.375     ],
    27        [ 0.33333333,  0.4       ,  0.45454545]])
    28 '''
    29 arr1 / arr2

        不同大小的数组之间的运算叫做广播(broadcasting)会在后面的内容中单独讲,本身是一个非常重要的概念

      三、基本的索引和切片 

        一维数组的索引和切片和Python列表的功能差不多,这里只做简单的举例,不做更多说明。

        区别的地方需要单独说明:1、在numpy的数组中,如果你将一个标量值赋值给一个切片时,例如arr[3:4] = 8,该值就会自动赋值给这个切片选区中,即(3,4]位置上的值都变成8;2、numpy中数组的切片时原始数组的视图,数据不会被复制,视图上的任何修改都会直接反应到原数组上。

     1 import numpy as np
     2 
     3 arr = np.array([1,2,3,4,5,6])
     4 
     5 arr[2,4] = 44
     6 
     7 '''
     8 array([1,2,44,44,5,6])
     9 '''
    10 print(arr)

        二维数组中,各个索引位置上的元素不再是标量而是一维数组,依次类推多维也是这样

    import numpy as np
    
    arr2d = np.array([[1,2,3],[2,3,4],[3,4,5]])
    
    '''
    array([3,4,5])
    '''
    arr2d[2]
    
    arr2d[0][2]  # 等价于 arr2d[0,2]
    

        二维数组的索引方式:纵轴表示 axis0,横轴表示axis1

        ndarray的切片语法跟Python列表这样的一维对象差不多,在多维度上也是一样的,但是我们需要记住各个索引位置的元素不再是标量二维一维数组

    1 import numpty as np
    2 
    3 arr = np.array([[1,2,3],[2,3,4],[3,4,5],[4,5,6]])
    4 
    5 '''
    6 array([[1,2,3],[2,3,4]])
    7 '''
    8 arr[:2]
    1 import numpty as np
    2  
    3 arr = np.array([[1,2,3],[2,3,4],[3,4,5],[4,5,6]])
    4  
    5 '''
    6 array([[1],[2]])
    7 '''
    8 arr[:2,:,1]

      四、布尔型索引

        可以对ndarray中的数据做布尔类型的判断截取

     1 import numpy as np
     2 
     3 arr = np.array([[1,2,3,4,5],[2,3,4,5,6],[3,4,5,6,7]])
     4 
     5 '''
     6 array([4, 5, 4, 5, 6, 4, 5, 6, 7])
     7 '''
     8 arr[arr > 3]
     9 
    10 '''
    11 array([3, 3, 3])
    12 '''
    13 arr[arr == 3]
    14 
    15 '''
    16 array([1, 2, 2])
    17 '''
    18 arr[arr < 3]

       五、花式索引

        花式索引(Fancy indexing)是一个Numpy术语,它指的是利用整数数组进行索引。

        为了以特定顺序选取行子集,只需要传入一个用于指定顺序的整数列表或者ndarray,以下为例子:

     1 import numpy as np
     2 
     3 '''
     4 array([[ 0.,  0.,  0.,  0.],
     5        [ 1.,  1.,  1.,  1.],
     6        [ 2.,  2.,  2.,  2.],
     7        [ 3.,  3.,  3.,  3.],
     8        [ 4.,  4.,  4.,  4.],
     9        [ 5.,  5.,  5.,  5.],
    10        [ 6.,  6.,  6.,  6.],
    11        [ 7.,  7.,  7.,  7.]])
    12 '''
    13 arr
    14 
    15 '''
    16 array([[ 4.,  4.,  4.,  4.],
    17        [ 3.,  3.,  3.,  3.],
    18        [ 0.,  0.,  0.,  0.],
    19        [ 6.,  6.,  6.,  6.]])
    20 '''
    21 arrr[[4,3,0,6]]  # 传入了指定顺序的整数列,4,3,0,6是顺序
    22 
    23 arr[[-1,-2,-5]]  # 负数从尾部开始取,顺序

        一次传入多个索引数组的情况,以下为实例:

     1 import numpy as np
     2 
     3 '''
     4 array([[ 0,  1,  2,  3],
     5        [ 4,  5,  6,  7],
     6        [ 8,  9, 10, 11],
     7        [12, 13, 14, 15],
     8        [16, 17, 18, 19],
     9        [20, 21, 22, 23],
    10        [24, 25, 26, 27],
    11        [28, 29, 30, 31]])
    12 '''
    13 arr = np.arange(32).reshape((8,4))
    14 
    15 '''
    16 array([4,23,29,10])
    17 '''
    18 arr[[1,5,7,2],[0,3,1,2]]  #最终取出的数据是 坐标(1,0)(5,3)(7,1)(2,2)
    19 
    20 '''
    21 array([[ 4,  7,  5,  6],
    22        [20, 23, 21, 22],
    23        [28, 31, 29, 30],
    24        [ 8, 11,  9, 10]])
    25 '''
    26 arr[[1,5,7,2]][:,[0,3,1,2]]  # 获取矩形区域
    27 
    28 '''
    29 np.ix()  将两个一维整数数组转换为一个用于选取方形区域的索引器
    30 '''
    31 arr[np.ix([1,5,7,2],[0,3,1,2])]  # 得到和上面一样的结果

      六、常用一元函数

    函数 说明
    abs、fabs 计算整数、浮点数或复数的绝对值。对于非复数值,可以使用更快的fabs
    sqrt   计算各元素的平方根。相当于arr**0.5
    square 计算各元素的平方。相当于arr**2
    exp 计算各元素的指数
    log log10 log2 log1p 分别为自然对数(底数为e)、底数为10的log、底数为2的log 、 log(1+x)
    sign 计算各元素的正负号:1正数,0零,-1负数
    ceil   计算各元素的ceiling值,即大于等于该值的最小整数
    floor  计算各元素的floor值,即小于等于该值的最大整数
    rint 将各元素值四舍五入到最接近的整数,保留dtype
    modf 将数组的小数和整数部分以两个独立数组的形式返回
    isnan 返回一个表示NAN的布尔型数组
    isfinite    isinf 分别返回一个表示,那些元素是有穷的 或者 哪些元素是无穷的 布尔类型数组
    cos  cosh  sin  sinh 普通型和双曲型三角函数

    arccos arccosh arcsin

    arcsinh  arctan  arctanh

    反三角函数
    logical_not 计算各元素not x的真值。相当于-arr

      七、二元常用函数

    函数 说明
    add 将数组中对应的元素相加
    subtract 从第一个数组中减去第二个数组中的元素
    multiply 数组元素相乘
    divide、floor_divide 除法或向下圆除法
    power 对第一个数组中的元素A,根据第二个数组中的相应元素B,计算AB
    maximum、fmax 计算元素级的最大值  fmax将忽略NaN
    minimum、fmin 计算元素级的最小值计算  fmin将忽略NaN 
    mod 元素级的求模计算(除法的余数)
    copysign 将第二个数组中的值的符号复制给第一个数组中的值

    greater、greater_equal

    less、less_equal

    equal、not_equal

    执行元素级的比较运算,最终产生布尔型数组。相当于>  >= <=

    < == !=

    logical_and logical_or

    logical_xor

    执行元素级的真值逻辑运算。相当于& | ^

      八、基本数组统计方法

    方法 说明
    sum 对数组中全部或某轴向的元素求和。零长度的数组和sum为0
    mean 算术平均数。零长度的数组的mean为NAN
    std、var 分别为标准差和方差,自由度可调(默认为n)
    min、max 最大值和最小值
    argmin、argmax 分别为最大和最小元素的索引
    cumsum 所有元素的累计和
    comprod 所有元素的累计积

        作为布尔类型数组的方法

        arr.any()  数组中是否存在一个或多个True

        arr.all()  数组中是否所有的值都为True

        排序:arr.sort()  返回排序后的数组

      九、数组的集合运算

    方法 说明
    unique(x) 计算x中的唯一元素,并返回有序结果
    intersect1d(x,y) 计算x和y中的公共元素,并返回有序结果
    union1d(x,y) 计算x和y的并集,并返回有序结果
    in1d(x,y) 得到一个表示‘x的元素是包含于y’的布尔数组
    setdiff1d(x,y) 集合的差,即元素在x中且不在y中
    setxor1d(x,y) 集合的对称差,即存在于一个数组中单不同时存在于两个数组中的元素

    内容参考自《利用Python进行数据分析》

  • 相关阅读:
    配置 L3 agent
    Why Namespace?
    虚拟 ​router 原理分析
    创建 router 连通 subnet
    用 config drive 配置网络
    cloud
    写在最前面
    使用apktool工具遇到could not decode arsc file的解决办法
    php-fpm优化
    解决官网下载jdk只有5k大小的错误
  • 原文地址:https://www.cnblogs.com/ymkfnuiwgij/p/7771637.html
Copyright © 2011-2022 走看看