zoukankan      html  css  js  c++  java
  • 利用Python进行数据分析——Numpy基础:数组和矢量计算

    利用Python进行数据分析——Numpy基础:数组和矢量计算

    • ndarry,一个具有矢量运算和复杂广播能力快速节省空间的多维数组
    • 对整组数据进行快速运算的标准数学函数,无需for—loop
    • 用于读写磁盘数据的工具以及用于操作内存映射文件的工具?
    • 线性代数、随机数生成以及傅里叶变换功能
    • 用于集成C/C++等代码的工具

    一、ndarry:一种多维数组对象

    1、创建ndarry

    #一维
    In [5]: data = [1,2,3]
    In [6]: import numpy as np
    In [7]: arr1 = np.array(data)
    In [8]: arr1
    Out[8]: array([1, 2, 3])
    #二维
    In [11]: data2 = [[1,2,3],[4,5,6]]
    In [12]: arr2 = np.array(data2)
    In [13]: arr2
    Out[13]:
    array([[1, 2, 3],
           [4, 5, 6]])
    #查看数组的信息
    In [15]: arr2.shape
    Out[15]: (2, 3)
    In [16]: arr2.dtype
    Out[16]: dtype('int32')
    

    数组创建函数
    array()
    arange(),类似Python内置函数range(),但是range()返回的是列表
    ones,zeros 创建一个全为1/0的数组,但是传进去的参数要是一个集合,例如np.ones((2,3))
    ones_like,zeros_like 创建一个跟传进去数组形状一样的全1/0数组
    empty,empty_like 创建空的数组,分配内存,不存值
    eye,identity 创建方阵

    2.数组和标量之间的运算

    In [36]: arr2
    Out[36]:
    array([[1, 2, 3],
           [4, 5, 6]])
    In [37]: arr3
    Out[37]:
    array([[11, 12, 13],
           [14, 15, 16]])
    #加
    In [38]: arr2+arr3
    Out[38]:
    array([[12, 14, 16],
           [18, 20, 22]])
    #乘
    In [39]: arr2*arr3
    Out[39]:
    array([[11, 24, 39],
           [56, 75, 96]])
    #减
    In [40]: arr3-arr2
    Out[40]:
    array([[10, 10, 10],
           [10, 10, 10]])
    #除
    In [41]: arr3/arr2
    Out[41]:
    array([[11.        ,  6.        ,  4.33333333],
           [ 3.5       ,  3.        ,  2.66666667]])
    #平方
    In [42]: arr2**2
    Out[42]:
    array([[ 1,  4,  9],
           [16, 25, 36]], dtype=int32)
    

    3.索引和切片

    索引:

    arr2d[0,0]或者是arr2d[0][0]
    arr3d[0,0,0]或者是arr3d[0][0][0]
    

    切片:有标记

    arr2d[:2,:2]
    arr3d[:2,:2]
    

    先区分数组和列表的操作
    数组的切片是在原始数组上进行的,而列表的切片操作则是进行了数据的赋值
    如果需要切片的是一份副本而不是源数组本身,需要arr[5:8].copy()

    #列表的切片
    >>> l1 = list(range(10))
    >>> l1
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> l2 = l1[5:8]
    >>> l2
    [5, 6, 7]
    >>> l2[0]=15
    >>> l2
    [15, 6, 7]
    >>> l1
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    #数组的切片
    In [50]: arr = np.arange(10)
    
    In [51]: arr
    Out[51]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
    
    In [52]: arr_slice = arr[5:8]
    
    In [53]: arr_slice
    Out[53]: array([5, 6, 7])
    
    In [54]: arr_slice[0]=15
    
    In [55]: arr_slice
    Out[55]: array([15,  6,  7])
    
    In [56]: arr
    Out[56]: array([ 0,  1,  2,  3,  4, 15,  6,  7,  8,  9])
    
    #二维数组的切片
    In [95]: arr2d
    Out[95]:
    array([[1, 2, 3],
           [4, 5, 6],
           [7, 8, 9]])
    
    In [96]: arr2d[:2]
    Out[96]:
    array([[1, 2, 3],
           [4, 5, 6]])
    

    一次可以传入多个切片

    In [97]: arr2d[:2,:1]
    Out[97]:
    array([[1],
           [4]])
    
    In [98]: arr2d[:2,:2]
    Out[98]:
    array([[1, 2],
    
    #3维
    In [83]: arr3d
    Out[83]: [[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]]
    
    In [84]: arr3d[1]
    Out[84]: [[7, 8, 9], [10, 11, 12]]
    
    In [85]: arr3d[1][1]
    Out[85]: [10, 11, 12]
    
    In [86]: arr3d[1][1][1]
    Out[86]: 11
    
    In [87]: arr3d[1][1][2]
    Out[87]: 12
    

    布尔型索引

    #[True,False,True]就相当有是取第0/2行
    In [121]: arr2d[[True,False,True]]
    Out[121]:
    array([[1, 2, 3],
           [7, 8, 9]])
    
    In [122]: arr2d[[True,False,True],2]
    Out[122]: array([3, 9])
    

    花式索引

    #与上边的博布尔型索引一样,也是取第0/2行
    In [132]: arr2d[[0,2]]
    Out[132]:
    array([[1, 2, 3],
           [7, 8, 9]])
    
    #花式索引注意以下问题
    

    花式索引跟切片不同,总是将数据复制到新数组中,所以造成以下现象

    In [136]: arr2d[[0,2],[0,2]]
    Out[136]: array([1, 9])
    
    In [137]: arr2d[[0,2]][:,[0,2]]
    Out[137]:
    array([[1, 3],
           [7, 9]])
    

    数组转置和轴对换

    转置是重塑的一种特殊形式,它返回的是源数据的视图,不会进行复制操作。

    In [142]: arr2d.T
    Out[142]:
    array([[1, 4, 7],
           [2, 5, 8],
           [3, 6, 9]])
    

    4.对数组的元素进行操作的函数

    对单个数组元素的操作函数

    • abs 计算绝对值
    • sqrt 计算各元素的平方根
    • square 计算各元素的平方
    • exp 计算各元素的以e为底的指数
    • log/log10/log2/log1p log1p是log(1+x)
    • sign 计算各元素的正负号
    • ceil 计算大于等于该元素的最小整数
    • floor 计算小于等于该元素的最大整数
    • rint 将该元素四舍五入到最接近的整数
    • modf 返回该元素的小数和整数部分,以两个独立数组的形式
    • isnan is not a number 判断各元素是否是数字
    • isfinite isinf 判断各元素有穷无穷
    • cos/sin/tan
    • arccos/acccosh/arcsin

    对两个数组元素操作的函数

    • add 将数组中元素相加
    • subtract 第一个数组中元素减去第二个数组中元素
    • multiply 数组对应元素相乘
    • divide floor_divide 除法、丢弃余数的除法
    • power(a,b) 将a中元素计算b中对应元素 a的b次方
    • mod 求除法的余数
    • copysign 将第二个数组中的元素符号赋值给第一个数组中的值
    • < >= <= == != 比较对应元素的值

    • logical_and/logical_or/logical_xor

    5.一些可以用数组来处理的运算

    矢量化方便运算

    三元运算

    In [6]: xarr = np.array([1.1,1.2,1.3,1.4,1.5])
    
    In [7]: yarr = np.array([2.1,2.2,2.3,2.4,2.5])
    
    In [8]: cond = np.array([True,False,True,True,False])
    
    In [9]: result = [x if c else y for x ,c ,y in zip(xarr,yarr,cond)]
    
    In [10]: result
    Out[10]: [1.1, 1.2, 1.3, 1.4, 1.5]
    

    np.where通常用于根据一个数组生成另外一个数组

    In [11]: result2 = np.where(cond,xarr,yarr)
    
    In [12]: result2
    Out[12]: array([1.1, 2.2, 1.3, 1.4, 2.5])
    

    数学和统计方法

    这些方法既可以当做实例方法调用arr2d.sum()也可以通过np.sum(arr2d)

    • sum 计算所有元素的和
    • mean 计算所有元素的均值
    • std/var 计算标准差和方差
    • min/max 最大值和最小值
    • argmin/argmax 最小值和最大值的索引
    • cumsum 返回一个所有元素累加的数组 累计和
    • cumprod 所有元素的累计积

    用于布尔型数组的方法

    #True直接当1计算
    In [24]: (arr2d<4).sum()
    Out[24]: 3
    
    In [25]: cond
    Out[25]: array([ True, False,  True,  True, False])
    
    In [26]: cond.any()
    Out[26]: True
    
    In [27]: cond.all()
    Out[27]: False
    

    排序

    • np.sort() 这个会复制一个副本
    • arr2d.sort()是在源数据上的操作

    6.用于数组文件的输入输出

    将数组以二进制形式保存到磁盘

    • np.save()
    • np.load()

    存取文本文件

    • np.loadtext()
    • np.savetext()

    7.线性代数 找不到时就在numpy.linalg

    • 注:转置 arr.T
    • np.dot(arr1,arr2) 两个矩阵的乘积
    • np.diag 返回对角线元素/或以一维数组转化为以此为对角线的方阵
    • trace() 计算对角线的和
    • det 计算f方阵的行列式值
    • eig 计算特征值和特征向量
    • inv 计算逆矩阵
    • pinv 计算伪逆矩阵
    • qr 计算QR分解
    • svd 计算奇异值分解
    • solve 解线性方程Ax=b
    • lstsq 计算Ax=b的最小二乘解

    8.随机数生成 numpy.random对Python内置的random进行了补充

    • seed 确定随机数生成的种子
    • permutation 返回一个序列的随机排列或返回一个随机排列的范围
    • shuffle 对一个序列就地随机排列
    • rand 产生均匀分布的样本值
    • randint 从给定的上下范围内随机选取整数
    • randn 产生正态分布的样本值
    • binomial 产生二项分布的样本值
    • normal 产生二项分布的样本值
    • beta 产生Beta分布的样本值
    • chisquare 产生卡方分布的样本值
    • gamma 产生Gamma分布的样本值
    • uniform 产生(0,1)均匀分布的样本值
  • 相关阅读:
    [LeetCode] 273. Integer to English Words 整数转为英文单词
    What happens when you type an URL in the browser and press enter?
    HTTP Status Code
    What's binary search?
    [Http] Difference between POST and GET?
    [LeetCode] 53. Maximum Subarray 最大子数组
    [LeetCode] 621. Task Scheduler 任务调度
    C# web项目添加*.ashx文件后报错处理
    Web项目和Windows应用程序的配置文件
    C#中web项目使用log4net日志
  • 原文地址:https://www.cnblogs.com/nadech/p/8973083.html
Copyright © 2011-2022 走看看