• 利用python数据分析——Numpy基础:通用函数、利用数组进行数据处理


    1 通用函数

    通用函数(ufunc)是一种对ndarray 中的数据执行元素级运算的函数。

    • 比如说sqrtexp
    In [137]: arr = np.arange(10)
    In [138]: arr
    Out[138]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
    In [139]: np.sqrt(arr)
    Out[139]: 
    array([ 0.    ,  1.    ,  1.4142,  1.7321,  2.    ,  2.2361,  2.4495,
            2.6458,  2.8284,  3.    ])
    In [140]: np.exp(arr)
    Out[140]: 
    array([    1.    ,     2.7183,     7.3891,    20.0855,    54.5982,
             148.4132,   403.4288,  1096.6332,  2980.958 ,  8103.0839])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 还有一些函数,例如add或maximum,接收2个数组。(也叫作二元ufunc),并返回一个结果数组:
    In [141]: x = np.random.randn(8)
    In [142]: y = np.random.randn(8)
    In [143]: x
    Out[143]: 
    array([-0.0119,  1.0048,  1.3272, -0.9193, -1.5491,  0.0222,  0.7584,
           -0.6605])
    In [144]: y
    Out[144]: 
    array([ 0.8626, -0.01  ,  0.05  ,  0.6702,  0.853 , -0.9559, -0.0235,
           -2.3042])
    In [145]: np.maximum(x, y)
    Out[145]: 
    array([ 0.8626,  1.0048,  1.3272,  0.6702,  0.853 ,  0.0222,  0.7584,   
           -0.6605])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 有些ufunc可以返回多个数组(但是不多)。例如modf是可以返回浮点数数组的小数和整数部分:
    In [146]: arr = np.random.randn(7) * 5
    In [147]: arr
    Out[147]: array([-3.2623, -6.0915, -6.663 ,  5.3731,  3.6182,  3.45  ,  5.0077])
    In [148]: remainder, whole_part = np.modf(arr)
    In [149]: remainder
    Out[149]: array([-0.2623, -0.0915, -0.663 ,  0.3731,
    0.6182,  0.45  ,  0.0077])
    In [150]: whole_part
    Out[150]: array([-3., -6., -6.,  5.,  3.,  3.,  5.])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    2 利用数组进行数据处理

    NumPy 数组可以使得 多种数据处理任务表述为简洁的 数组表达式(否则需要编写循环)。

    用数组表达式代替循环的做法,通常被称为矢量化。

    2.1 np.meshgrid() 函数

    np.meshgrid() 函数指的是,根据所给的向量返回坐标矩阵。

    举例:
    给的横坐标是[1,2,3], 纵坐标是 [7, 8]
    返回的是

    [array([ [1,2,3] [1,2,3] ]), array([ [7,7,7] [8,8,8] ])]
    
    • 1

    也就是代表了六个点,(1, 7) (2, 7) (3, 7) (1, 8) (2, 8) (3, 8)

    #coding:utf-8
    import numpy as np
    # 坐标向量
    a = np.array([1,2,3])
    # 坐标向量
    b = np.array([7,8])
    # 从坐标向量中返回坐标矩阵
    # 返回list,有两个元素,第一个元素是X轴的取值,第二个元素是Y轴的取值
    res = np.meshgrid(a,b)
    #返回结果: [array([ [1,2,3] [1,2,3] ]), array([ [7,7,7] [8,8,8] ])]
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 再举一个例子:如果想要在一组网格上计算函数 sqrt(x^2 + y^2)
    In [155]: points = np.arange(-5, 5, 0.01) # 1000 equally spaced points
    In [156]: xs, ys = np.meshgrid(points, points)
    In [157]: ys
    Out[157]: 
    array([[-5.  , -5.  , -5.  , ..., -5.  , -5.  , -5.  ],
           [-4.99, -4.99, -4.99, ..., -4.99, -4.99, -4.99],
           [-4.98, -4.98, -4.98, ..., -4.98, -4.98, -4.98],
           ..., 
           [ 4.97,  4.97,  4.97, ...,  4.97,  4.97,  4.97],
           [ 4.98,  4.98,  4.98, ...,  4.98,  4.98,  4.98],
           [ 4.99,  4.99,  4.99, ...,  4.99,  4.99,  4.99]])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 现在,对该函数的求值运算就好办了,把这两个数组当做两个浮点数那样编写表达式即可:
    In [158]: z = np.sqrt(xs ** 2 + ys ** 2)
    In [159]: z
    Out[159]: 
    array([[ 7.0711,  7.064 ,  7.0569, ...,  7.0499,  7.0569,  7.064 ],
           [ 7.064 ,  7.0569,  7.0499, ...,  7.0428,  7.0499,  7.0569],
           [ 7.0569,  7.0499,  7.0428, ...,  7.0357,  7.0428, 7.0499],
           ..., 
           [ 7.0499,  7.0428,  7.0357, ...,  7.0286,  7.0357,  7.0428],
           [ 7.0569,  7.0499,  7.0428, ...,  7.0357,  7.0428,  7.0499],
           [ 7.064 ,  7.0569,  7.0499, ...,  7.0428,  7.0499,  7.0569]])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    2.2 将条件逻辑表述为数组运算

    • numpy.where 函数是三元表达式 x if condition else y 的矢量化版本。

    首先,初始化两个值数组和一个布尔数组:

    In [165]: xarr = np.array([1.1, 1.2, 1.3, 1.4, 1.5])
    In [166]: yarr = np.array([2.1, 2.2, 2.3, 2.4, 2.5])
    In [167]: cond = np.array([True, False, True, True, False])
    
    • 1
    • 2
    • 3
    • 要求是根据cond中的值,选取xarr和yarr中的值:当cond为True时,选择xarr的值,否则从y中选取。

    推导式方法:

    In [168]: result = [(x if c else y)
       .....:           for x, y, c in zip(xarr, yarr, cond)]
    In [169]: result
    Out[169]: [1.1000000000000001, 2.2000000000000002, 1.3, 1.3999999999999999, 2.5]
    
    • 1
    • 2
    • 3
    • 4
    • 上面的推导式对于大数组的处理不是很快(因为所有的工作由Python完成);而且无法用于多维数组。

    • 可以使用 np.where()

    In [170]: result = np.where(cond, xarr, yarr)
    In [171]: result
    Out[171]: array([ 1.1,  2.2,  1.3,  1.4,  2.5])
    
    • 1
    • 2
    • 3
    • 在数据分析工作中,where通常用于根据另一个数组而产生一个新的数组。

    举例,首先初始化一个arr数组。

    In [172]: arr = np.random.randn(4, 4)
    In [173]: arr
    Out[173]: 
    array([[-0.5031, -0.6223, -0.9212, -0.7262],
           [ 0.2229,  0.0513, -1.1577,  0.8167],
           [ 0.4336,  1.0107,  1.8249, -0.9975],
           [ 0.8506, -0.1316,  0.9124,  0.1882]])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    然后,用arr>0 这个矢量表达式,得到一个bool数组。(这一步的工作不是必要的,是为了方便理解王np.where()函数)

    
    In [174]: arr > 0
    Out[174]: 
    array([[False, False, False, False],
           [ True,  True, False,  True],
           [ True,  True,  True, False],
           [ True, False,  True,  True]], dtype=bool)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 需求:对于一个矩阵,希望将所有正数替换为2,所有负数替换为-2.
    
    In [175]: np.where(arr > 0, 2, -2)
    Out[175]: 
    array([[-2, -2, -2, -2],
           [ 2,  2, -2,  2],
           [ 2,  2,  2, -2],
           [ 2, -2,  2,  2]])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 将标量和数组结合起来。还是刚刚的例子,只要将所有正值替换为2,其余数不变。
    In [176]: np.where(arr > 0, 2, arr) # set only positive values to 2
    Out[176]: 
    array([[-0.5031, -0.6223, -0.9212, -0.7262],
           [ 2.    ,  2.    , -1.1577,  2.    ],
           [ 2.    ,  2.    ,  2.    , -0.9975],
           [ 2.    , -0.1316,  2.    ,  2.    ]])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2.3 数学和统计方法

    • 感觉对我有用的方法是:argminargmaxcumsumcumprod
      在这里插入图片描述
      在这里插入图片描述

    2.4 用于布尔型数组的方法

    在上面这些方法中,布尔值会被强制转换为1(True)和0(False)。因此,sum经常被用来对布尔型数组中的True值计数:

    In [190]: arr = np.random.randn(100)
    In [191]: (arr > 0).sum() # Number of positive values
    Out[191]: 42
    
    • 1
    • 2
    • 3
    • any用于测试数组中是否存在一个或多个True,而all则检查数组中所有值是否都是True:
    In [192]: bools = np.array([False, False, True, False])
    In [193]: bools.any()
    Out[193]: True
    In [194]: bools.all()
    Out[194]: False
    
    • 1
    • 2
    • 3
    • 4
    • 5
  • 相关阅读:
    计算机毕业设计SSM订餐系统【附源码数据库】
    spark的保姆级配置教程
    Python中的——random模块
    myql的三种删除方式:delete truncate drop
    QT中进程的创建
    Java面向对象——多态
    Java中main方法是单线程还是多线程?启动后有多少个线程会被创建?
    使用canal实现数据实时同步
    这种考勤方式,居然能轻松实现!
    java word转pdf,word模板
  • 原文地址:https://blog.csdn.net/weixin_42521185/article/details/125496912