zoukankan      html  css  js  c++  java
  • numpy教程

    使用jupyter notebook 分析数据之前导入的包

    import numpy as np # linear algebra
    import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)
    
    %matplotlib inline
    import matplotlib.pyplot as plt  # Matlab-style plotting
    import seaborn as sns
    color = sns.color_palette()
    sns.set_style('darkgrid')
    
    import warnings
    def ignore_warn(*args, **kwargs):
        pass
    warnings.warn = ignore_warn #ignore annoying warning (from sklearn and seaborn)
    

    numpy的使用过程中,最重要的概念就是ndarray,实质上就是数组,在numpy中的所有对象都是ndarray

    每一个ndarray对象都有一个shape和dtype属性,用于存储数组的形状数据类型

    函数 说明
    array 将输入的数据转换为ndarray
    asarray 将输入转换为ndarray
    arange range的数组版本
    ones、ones_like 根据指定的形状创建一个全1的数组,ones_like以另一个数组为参数,创建一个与该数组大小相同的全为1的数组
    zero、zeros_like 与ones和ones_like类似
    empty、empty_like 创建一个没有赋予初始值的数组,用法与ones和ones_like类似
    eye,identity 创建一个单位矩阵

    可以通过ndarray的astype方法将数组的数据类型转换为其他类型

    乘法

    *:直接用乘号或者除号,表示数组元素之间直接相乘,这个操作称之为广播(不同大小数组之间的运算)

    np.dot(x,y)或x.dot(y):用于矩阵乘积

    索引和复制

    In [1]: arr = np.arange(10)
    In [2]: arr
    Out[2]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
    In [3]: arr[5:8] = 12
    In [4]: arr
    Out[4]: array([ 0,  1,  2,  3,  4, 12, 12, 12,  8,  9])
    In [5]: arr_slice = arr[5:8]
    In [6]: arr_slice[1] = 12345
    In [7]: arr
    Out[7]: array([    0,     1,     2,     3,     4,    12, 12345,    12,     8,     9])
    

    numpy当中所有数据切片赋值时都是没有进行复制的,视图上的任何修改都会直接反映到原数组上,因为numpy一般处理非常大的数据集,如果numpy每次进行操作的话就是复制非常多的数据。

    花式索引(fancy indexing)

    In [1]: arr = np.arange(32).reshape((8,4))
    
    In [2]: arr
    Out[2]:
    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],
          [24, 25, 26, 27],
          [28, 29, 30, 31]])
    
    In [3]: arr[[-1,1,3]]
    Out[3]:
    array([[28, 29, 30, 31],
          [ 4,  5,  6,  7],
          [12, 13, 14, 15]])
    In [4]: arr[[1,2,3,-1],[3,2,1,0]]
    Out[4]: array([ 7, 10, 13, 28])
    

    同时传入多个索引,一次索引出多个值

    转置

    arr.T表示arr的转置,或者transpose方法表示转置

    tanspose有一个换维度的操作

    In [4]: arr = np.arange(16).reshape((2,2,4))
    
    In [5]: arr
    Out[5]:
    array([[[ 0,  1,  2,  3],
            [ 4,  5,  6,  7]],
    
           [[ 8,  9, 10, 11],
            [12, 13, 14, 15]]])
    
    In [6]: arr.transpose((1,0,2))
    Out[6]:
    array([[[ 0,  1,  2,  3],
            [ 8,  9, 10, 11]],
    
           [[ 4,  5,  6,  7],
            [12, 13, 14, 15]]])
    简而言之就是将原来的0,1,2轴变成现在的1,0,2,转换后的0轴是原来的1轴,转换后的1轴是原来的0轴,2轴未变。
    换种解释:比如说8元素的索引是[1,0,0],0,1轴变换后是[0,1,0]。
    

    通用函数

    (ufunc):快速的元素级数组函数

    函数 说明
    abs,fabs 计算绝对值,对于非复数,可以使用更快的fabs
    sqrt 计算元素的平方根,相当于arr**0.5
    square 计算各元素平,相当于arr**2
    log,log10,log2,log1p 计算自然对数,以10位底的对数,底数为2的对数,以及log(1+x)
    sign 取元素的符号,1正,0零,-1负
    ceil 向上取整
    向下取整
    四舍五入取整
    将数组的小数和整数部分分别用两个数组返回
    isfinite,isinf 返回哪些元素是有穷的,哪些元素是无穷的布尔型数组
    cos,cosh,sin,sinh,tan,tanh 三角函数
    logical_not 计算各元素not x的真值,相当于-arr

    二元ufunc

    函数 说明
    add 将数组对应元素相加
    subtract 对应元素相减
    multiply 对应元素相乘
    divide,floor_divide 除法或丢掉余数的整除法
    pow 计算(A^B)
    maximum, fmax 元素级的最大值计算,fmax忽略nana
    minimum,fmin 最小值计算
    mod 求模运算
    copysign 将B数组的符号复制给第一个数组
    greater,greater_equal,less,less_equal,equal, not_equal 元素比较
    logical_and, logical_or,logical_xor 元素级别真值逻辑运算

    meshgrid函数

    X,Y = np.meshgrid(a,b) 得到X为a作为行向量,扩展b.shape那么多行,Y是以b为列向量,扩展a.shape那么多列

    In [67]: xnums
    Out[67]: array([0,1, 2, 3])
     
    In [68]: ynums
    Out[68]: array([0,1, 2, 3, 4])
     
    In [69]: data_list= np.meshgrid(xnums,ynums)
     
    In [70]: data_list
    Out[70]:
    [array([[0, 1, 2,3],
            [0, 1, 2, 3],
            [0, 1, 2, 3],
            [0, 1, 2, 3],
            [0, 1, 2, 3]]), array([[0, 0, 0, 0],
            [1, 1, 1, 1],
            [2, 2, 2, 2],
            [3, 3, 3, 3],
            [4, 4, 4, 4]])]
    

    np.where()

    np.where可以进行x if condition else y的快捷形式

    比如我们在下面的例子中,将所有正数替换为2,负数替换为1

    In [7]: arr = np.random.randn(4,4)
    
    In [8]: arr
    Out[8]:
    array([[ 0.67616266, -0.05338506,  1.24429511, -0.01608611],
           [ 1.19887484, -0.26227917, -1.06689128,  1.6256341 ],
           [ 1.33528028, -0.56730727,  0.00761954,  0.15508178],
           [-1.4552253 ,  0.12884633,  0.63242436, -0.62763473]])
    
    In [9]: np.where(arr>0, 2, 1)
    Out[9]:
    array([[2, 1, 2, 1],
           [2, 1, 1, 2],
           [2, 1, 2, 2],
           [1, 2, 2, 1]])
    

    基本统计方法

    sum求和,mean均值,std标准差,var方差,min,max最小最大值

    argmin,argmax最小最大值的索引

    cumsum:所有元素的累积和,和search_sorted方法配合可以算出分位数所在的位置

    In [10]: arr = np.random.randn(1000)
    
    In [11]: arr.sort()
    
    In [12]: arr.searchsorted(int(0.05*(max(arr)-min(arr))))
    Out[12]: 458
    

    cumprod:所有元素的累积积

    唯一化及逻辑运算

    np.unique效果与python中的set对于list的效果一样,只保留不相同的值

    np.in1d用于测试参数是否在数组中

    In [13]: arr = np.arange(6)
    
    In [14]: arr
    Out[14]: array([0, 1, 2, 3, 4, 5])
    
    In [15]: np.in1d(arr,[0,3,4])
    Out[15]: array([ True, False, False,  True,  True, False], dtype=bool)
    

    集合运算的函数

    函数 说明
    unique 返回唯一元素的有序结果
    intersect1d(x,y) 交集(计算xy的公共元素并返回有序结果)
    union 并集
    in1d(x,y) y是否存在于x中的布尔数组
    setdiff1d 差集
    setxor1d 对称差,存在于一个数组中但不同时存在于两个书注重的元素

    元素保存

    np.save('filename', arr):如果没有加后缀会自动加上.npy,然后可以使用np.load读取这个array

    np.savez('filename', a=arr1, b=arr2):存储到压缩文件,后缀为.npz,读取时用load,然后通过字典key,value的索引方式分别取出a和b

    np.loadtxt('array.txt',delimiter=','):读取txt文件,指定分隔符号为delimiter

    np.savetxt('filename', arr):保存为txt文件

    线性代数运算

    函数 说明
    diag 返回方阵的对角线元素,或者把一维数组转化为方阵
    dot 矩阵乘法
    trace 对角线元素和
    det 矩阵行列式
    eig 计算方阵的特征值和特征向量
    inv 求方阵的逆
    pinv 伪逆
    计算QR分解值
    svd 奇异值分解
    解线性方程Ax=b,其中A是一个矩阵
    计算Ax=b的最小二乘解

    随机数生成

    函数 说明
    seed 确定随机数生成器的种子
    permutation 返回一个序列的随机排列或者一个随机排列的范围
    shuffle 随机打乱一个序列
    rand 产生均匀随机分布的样本值
    randint 从给定的上下范围内随机选取整数
    randn 产生正态分布(平均值为0,标准差为1)的样本值
    产生二项分布的样本值
    产生正态分布的样本值
    产生beta分布的样本值
  • 相关阅读:
    区块链技术基础
    理解数字货币
    MySQL-插入更新 ON DUPLICATE KEY UPDATE
    Flume-Failover Sink Processor 故障转移与 Load balancing Sink 负载均衡
    Flume-Replicating Channel Selector 单数据源多出口
    Flume-几种拓扑结构
    Flume-事务与传输流程
    Java-JPDA 概述
    Navicat Premium
    Flume-Taildir Source 监控目录下多个文件的追加
  • 原文地址:https://www.cnblogs.com/drawon/p/8520716.html
Copyright © 2011-2022 走看看