数据分析手册-numpy数组(3)--高级通用函数的进一步探索与聚合的讲解

      1. 绝对值

​ 正如numpy能够理解python内置的运算操作,numpy同样也可以理解python内置的绝对值函数**:直接对数组使用abs()操作即可**

​ 对应的numpy通用函数是np.absolute,该函数也可以用np.abs-别名来访问

同样地,这个通用函数也可以用于处理复数。当处理复数时,绝对值返回的是该元素的模(magnitude).

  1. 三角函数

    numpy提供了很多好用的通用函数,其中对于数据科学家来说最有用的就是三角函数无疑。

    可以通过定义一个角度数组,然后用三角函数对于角度数组进行计算。这些值是在机器精度内进行计算的,所以有些应该是0的值并没有精确到0。同样的,逆三角函数也可以进行使用。例如arcsin、arccos等.

    1. 指数运算

      numpy中还有一个较为常用的通用函数是指数运算:

      例如2^x e^x等,指数运算的逆运算,即对数运算也是可以用的。最基本的np.log()给出的是以自然常数也就是e为底数的对数,如果你希望计算以其他数字为底数的对数,可以按照如下处理:

       ln(x)
       log2(x)
       log10(x)
      

    还有一些比较特殊的版本,对于较小的输入值也可以保持不错的精度。

    print("exp(x)-1=",np.expm1(x))
    print("log(1+x)=",np.log1p(x))
    

    当x的输入值很小时,使用以上函数所给出的值会比np.log和np.exp的计算更为精确。

    1. 专用的通用函数

      numpy还有其他许多更为专业的数学计算函数,例如双曲三角函数、比特位计算、比较运算符、弧度转化为角度的运算、取整和求余运算等等。可以参考numpy的官方文档。

      还有一个更加专用,也更加晦涩的通用函数优异来源是子模块scipy.special.如果你希望对你的数据进行一些更晦涩的数学计算,scipy.special可能包含了你需要的计算函数。这些函数多到甚至可以列出一个长长的列表。例如

      from scipy import special
      #Gamma函数(广义阶乘,generalized factorials)和相关函数
      x=[1,5,10]
      print("gamma(x) =",special.gamma(x))
      print("ln|gamma(x) =",special.gammaln(x))
      print("beta(x,2) =",special.beta(x,2))
      
      #误差函数(高斯积分)
      #它的实现和它的逆实现
      x=np.arrar([0,0.3,0.7,1.0])
      print("erf(x) =",special.erf(x))
      print("erfc(x) =",special.erfc(x))
      print("erfinv(x) =",special.erfinv(x))
      
      

      numpy和scipy.special中提供了大量的通用函数,这些包的文档在网上就可以查到,搜索"gamma function python"即可。

      1. 高级的通用函数特性

        1. 指定输出

          在进行大量运算时,有时候指定一个用于存放运算结果的数组是非常有用的。不同于创造临时数组,你可以用这个特性将计算结果直接写入到你期望的存储位置。所有的通用函数都可以通过out参数来指定计算结果的存放位置:例如

          x=np.arrage(5)
          y=np.empty(5)
          np.multiply(x,10,out=y)
          print(y)
          

          这个特性也可以用作数组视图,例如可以将计算结果写入指定数组的没隔一个元素的位置:

          import numpy as np
          x=np.arange(5)
          y=np.zeros(10)
          np.power(2,x,out=y[::2])
          print(y)
          

          如果这里写的是y[: : 2]=2x,那么结果将会是创建一个临时数组,该数组存放的是2 * * x的结果,并且接下来会将这些值复制到y数组中。对于较小的计算量例子来说,上述两种方式差别并不大,但是如果对于计算量较大的数组来说,有效地使用out参数可以很好的节约内存。**

          1. 聚合

            二元通用函数还有一些非常有用的特性,例如聚合,聚合可以直接在对象上计算。

            ​ 附: reduce函数的官方解释为:Apply a function of two arguments cumulatively to the items of a sequence,from left to right, so as to reduce the sequence to a single value.

​ 从左到右对一个序列的项累计地应用有两个参数的函数,以此合并序列到一个 单一值。也就是聚合的意思 序列: 序列 其实就是python中 tuple list dictionary string 以及其他可迭代物

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UCecKRhB-1606657451933)(C:\Users\QXY\AppData\Roaming\Typora\typora-user-images\image-20201129203353984.png)]

reduce的工作过程是 :在迭代sequence(tuple ,list ,dictionary, string等可迭代物)的过程中,首先把 前两个元素传给 函数参数,函数加工后,然后把得到的结果和第三个元素作为两个参数传给函数参数, 函数加工后得到的结果又和第四个元素作为两个参数传给函数参数,依次类推。 如果传入了 initial 值, 那么首先传的就不是 sequence 的第一个和第二个元素,而是 initial值和 第一个元素。经过这样的累计计算之后合并序列到一个单一返回值。

reduce可以暂时理解为聚合一个数组,下面举两个例子吧

例1:

import numpy as np
x=np.arange(1,6)
np.add.reduce(x)

# the output will be 15. 也就是返回数组中所有元素两两相加后得到的和.

例2:

import numpy as np
np.multiply.reduce(x)

# the output 返回数组中所有元素两两相乘后得到的和.

如果需要存储每次计算的中间结果时,可以使用accumulate.

np.add.accumulate(x)
# output: array([1,3,6,10,15]) --因为5个元素,所以只能有4个后面的结果
np.multiply.accumulate(x)
# output: array([1,2,6,24,120])

当然,在一些特殊情况中,numpy也提供了专用的函数(np.sum、np.prod、np.cumsum、np.cumprod),它们同样也可以实现以上reduce的功能.

  1. 外积

    任何通用函数都可以用outer方法来获得两个不同输入数组所有元素对的函数运算结果。

    比较好玩的例子是,你可以用一行代码实现一个乘法表。

x=np.arange(1,6)
np.multiply.outer(x,x)
image-20201129204654705

后面还会介绍通用函数很有意思的ufunc.at和ufunc.reduceat方法.

还有一个较为重要的特性是广播(broadcasting),可以对不同大小和形状的数组进行操作.

更多信息可以在numpy和scipy的官方文档网站找到.

前面介绍过,可直接在Ipython中通过导入相应的包,然后利用Ipython的Tab键补全和帮助(?)功能获取信息。

  1. 聚合:最小值、最大值和其他值

当你面对大量的数据时,第一个步骤通常都是计算相关数据的概括统计值。最常用的概括统计值可能是均值和标准差,还有一些形式(例如求和、乘积、中位数、最小值和最大值、分位数、等等)的聚合也是非常有用的。

而numpy恰恰就有很多这样的非常快速的内置函数可以用于数组。

  1. 数组值求和

    python可以使用内置的sum函数计算一个数组中所有元素的和。–使用np.shape()函数可以获取矩阵的尺寸以及大小

    import numpy as np
    L=np.random.random(100)
    sum(L)
    

    这numpy.sum函数是在编译码中执行操作,所以numpy的操作计算得更快一些:

    big_array=np.random.rand(1000000)
    %timeit sum(big_array)
    %timeit np.sum(big_array)
    

    但是需要注意,sum函数和np.sum函数并不等同,有时会导致混淆。尤其是它们各自的可选参数都有不同的涵义,np.sum函数是知道数组的维度的,后面会再细细讲解这方面的知识。

    1. 最小值和最大值

      同样的,numpy对应的函数也有min、max,python内置也有min、max

      对于min、max、sum和其他numpy聚合,一种更简洁的语法形式是数组对象直接调用这些方法,

      例如

      print(big_array.min())
      print(big_array.max())
      print(big_array.sum())
      

      attention! ,当你操作numpy数组时,确保你执行的是numpy版本的聚合。

      1. 多维度聚合

        一种常见的聚合操作是沿着一行或者一列聚合。例如,假设你有一些数据存在二维数组中,聚合函数还有一个参数,用于指定沿着哪个轴的方向进行聚合,例如可以通过axis=0来找到每一列的最小值

        M=np.random.random((3,4))
        print(M)
        M.min(axis=0)
        M.max(axis=1)
        

        axis关键字指定的是数组将会被折叠,而不是将要返回的维度。

        因为指定axis=0意味着第一个轴将要被折叠,对于二维数组,这意味着没一列的值都将被聚合。

        其他聚合函数

        numpy提供了很多其他聚合函数,但是这里不会详细地介绍它们。另外,大多数的聚合都有对NaN值的安全处理策略(NaN-safe),即计算时忽略所有的缺失值,这些缺失值即特殊的IEEE浮点型NaN值,有些NaN-safe的函数直到Numpy1.8版本才加进去,所以更早版本的numpy并不支持此功能。

函数名称 NaN安全版本 描述
np.sum np.nansum 计算元素的值
np.prod np.nanprod 计算元素的积
np.mean np.nanmean 计算元素的平均值
np.std np.nanstd 计算元素的标准差
np.var np.nanvar 计算元素的方差
np.min np.nanmin 找出最小值
np.max np.nanmax 找出最大值
np.argmin np.nanargmin 找出最小值的索引
np.argmax np.nanargmax 找出最大值的索引
np.median np.nanmedian 计算元素的中位数
np.percentile np.nanpercentile 计算基于元素排序的统计值
np.any N/A 验证是否存在元素为真
np.all N/A 验证所有元素是否为真

后面的博客会展示这些聚合函数的使用方法.

猜你喜欢

转载自blog.csdn.net/weixin_45870904/article/details/110354796
今日推荐