第四章 NumPy数学函数应用
00 min
2024-5-13

4.1 NumPy中的数学运算

4.1.1 数学常数的调用

常量
NumPy中的定义
纳皮尔数
np.e
圆周率
np.pi

4.1.2 四则运算

在上一个章节中, 我们简单演示了数组的四则运算(+、-、*、/)。数组间能进行四则运算的前提是数组的维度shape是一致的或者shape不一致情况下广播功能能正常运行,否则运算就会报错。(如果因为广播机制导致运算出错的初学者,建议复习第一章节内容)
此外,NumPy中也存在与四则运算符作用相同的函数(np.add)等,除非是需要明确的表示是在使用ndarray进行数组操作,一般都不需要使用这些函数。
内积(矩阵乘法):np.dot(arr1, nd2)或者nd1.dot(nd2) (n, m) 和 (i, j) ⇒ (n, j) m=i两数组才能做内积运算,也叫矩阵乘法运算 外积:np.outer(arr1, arr2) 张量积:np.kron(arr1, arr2)

4.1.3 绝对值函数

  • np.absolute() 取绝对值,原数据类型输出,支持返回复数的绝对值
    • 可简写为np.abs()
  • np.fabs() 取绝对值,整形会转为字符型输出,不支持返回复数的绝对值

4.1.4 数值取舍

在NumPy中用于计算近似值的函数中,包括如下函数
函数
含义
np.floor
向下取整(取值比其小的整数, 负数和正数都会变小)
np.trunc
取整(直接舍弃小数部分, 负数变大, 正数变小)
np.ceil
向上取整
np.round
四舍五入取整
np.around
四舍五入取整(同np.round)
np.rint
四舍五入,对于x.50取偶数的整数(x或x+1),x.5y往上取整
np.fix
取最接近0的整数

4.1.5 复数

NumPy提供了复数运算支持,只需在虚部添加j即可。此外含有相关函数:
  • np.real(a) 返回a的实部
  • np.imag(a) 返回a的虚部
  • np.conj(a) 返回a的共轭复数
复数是在声波的相位、计算机图形中经常使用的四元数等应用中经常被使用到的很方便的概念。
四元数是对复数进行扩展后做得到的概念,是由一个实部和3个虚部所构成的数。在对三维空间的物体进行旋转等表示中经常使用到。

4.1.6 数学函数

在本机,大样将会介绍如何用NumPy如何进行幂运算、求平方根运算、三角函数和反三角函数、指数函数和对数函数。

1、幂运算 np.power(x, n)和求平方根运算np.sqrt(x)

幂运算可以使用np.power(x, n)函数对x的t次方的值进行求解。才外同样可以使用运算符** ,通过x**t一样能获得结果。求平方根运算np.sqrt(x)其实就是求x的0.5次方,就可以使用x**0.5来获得同样的结果。

2、三角函数和反三角函数

  • np.sin(radian) 正弦
  • np.cos(radian) 余弦
  • np.tan(radian) 正切
在上面三角函数中的参数是弧度(radiant),而不是角度(degree),后面内容将会介绍如何在角度和弧度之间进行转化。
  • np.arcsin()
  • np.arccos()
  • np.arctan()
在三角函数的前面加上arc就是对应的反三角函数。由于是反三角函数,如arcsin,当sin(x)=y时,要计算的x的值就可以用arcsin(y)=x。
如何在弧度和角度之间进行转换呢?
  • 角度 ⇒ 弧度:degree * np.pi / 180
  • 弧度 ⇒ 角度:radiant *180 / np.pi
当然在Numpy中,已经提供了简化上面这一操作的专用函数:
  • np.rad2deg(radiant) 将弧度换算为角度
  • np.deg2rad(degree) 将角度换算为弧度
  • np.radians(degree) 将角度换算为弧度

3、指数和对数函数

在NumPy中提供了e**x函数的实现(e为纳皮尔常数),为np.exp(x)。不过使用np.e**x即可实现np.exp(x)功能,大样推荐使用运算符,好记更符合数学描述写法。
对于对数函数来说,只有那些使用了特殊底的函数是提供了支持的。
  • np.log(x):底为np.e
  • np.log2(x):底为2
  • np.log10(x):底为10
  • np.log1p(x):底为e,计算log(1+x)

4.2 NumPy中的统计函数

本节大样将会讲解数组元素的求平均值、中位数、和、标准差、方差、协方差以及相关系数。
平均值
  • np.average(a, axis=None, weights=None, returned=False)
  • np.mean(a, axis=None, dtype=None, out=None, keepdims=False)
中位数
  • np.median(a, axis=None, out=None, overwrite_input=False, keepdims=False)
  • np.sum(a, axis=None, dtype=None, out=None, keepdims=False)
标准差
  • np.std(a, axis=None, dtype=None, out=None, ddof=0, keepdims=False)
方差
  • np.var(a, axis=None, dtype=None, out=None, ddof=0, keepdims=False)
协方差
相关系数

4.2.1 计算元素平均值

  • np.average:
    • 可以计算数组的加权平均值,
    • 不可以指定计算平均值时所使用的数据类型
    • 计算平均值后维度降低
  • np.mean:
    • 不可以指定权重,
    • 但是可以指定计算平均值时所使用的数据类型
    • 计算平均值后维度可以不降低

1. np.average函数

  • np.average(a, axis=None, weights=None, returned=False)
    • a:array_like(类似数组对象)
    • axis:int(或int元组),可省,默认None,指定沿着哪个坐标轴计算平均值。默认返回所有元素的平均值
    • weights:array_like,可省,默认为None,为每个元素设置在计算平均值时所使用的权重。分配的权重值越大,对应元素对平均值得影响也越大。
    • returned:bool值,可省,默认False。指定返回值的格式是否使用(平均值、权重合计)这样的元组类型。
  • 返回值:
    • 不指定坐标轴:返回所有元素的平均值,为float类型数值
    • 指定坐标轴axis:返回numpy.ndarray数组类型。
    • 当returned=True:返回的是(平均值,权重合计格式的元组)。
      • 不指定坐标轴,返回元组
      • 指定了坐标轴,返回元素为元组的ndarray类型
带权重的平均值求法:
数组元素乘以对应权重并求和,然后除以权重之后。上面例子中计算方法为(0*0 + 1*1 + 2*2 + 3*3 + 4*4) / (0 + 1 + 2 + 3 + 4) = 3.0

2. np.mean函数和np.ndarray.mean函数

  • np.mean(a, axis=None, dtype=None, out=None, keepdims=False)
    • a:array_like类型,可省
    • axis:int或int数组,可省
    • dtype:数据类型,可省,指定在计算平均值时使用的数据类型
    • out:ndarray类型,可省,指定保存计算结果的数组。shape和数据类型等信息要指定齐全(基本不用)
    • keepdims:bool值,可省,默认False。指定返回的数组的维度是否会降低
  • np.mean(axis=None, dtype=None, out=None, keepdims=False)
    • 使用方法和np.mean完全相同
通过将参数keepdims指定为True来使用广播功能。例如,当需要将原有的数据和计算得到的平均值之间进行运算时,指定keepdims=True是比较安全的做法。
例如,对shape为(2, 5, 10)的数组arr1,在axis=2方向上进行计算平均值,得到shpe为(2, 10)的arr2数组,那么arr1和arr2之间是没法进行广播计算的。
后面介绍的中位数、元素和、标准差、方差等函数也有keepdims参数,是一样的用处。
通过将参数keepdims指定为True来使用广播功能。例如,当需要将原有的数据和计算得到的平均值之间进行运算时,指定keepdims=True是比较安全的做法。 例如,对shape为(2, 5, 10)的数组arr1,在axis=2方向上进行计算平均值,得到shpe为(2, 10)的arr2数组,那么arr1和arr2之间是没法进行广播计算的。 后面介绍的中位数、元素和、标准差、方差等函数也有keepdims参数,是一样的用处。

4.2.2 计算元素中位数

1、中位数概念

所谓中位数,是指当数据按照大小顺序排列好之后,正好位于中间位置的值。
  • 当数据总数为奇数个时,中位数就是中间的那个数
  • 当数据总数为偶数个时,中位数就是中间两个数的平均值。
与中位数非常相似的指标为平均值。在计算平均值时,如果集合中包含偏离程度很大的离散值,那么将平均值作为数据集合的指标就会有问题。而中位数正是因为具有几乎不受这种离散值影响的特点,因而经常被作为指标数据使用。

2、计算中位数np.median

  • np.median(a, axis=None, out=None, overwrite_input=False, keepdims=False)
    • a:array_like类型,可省
    • axis:int或int数组,可省
    • out:ndarray类型,可省,指定保存计算结果的数组。shape和数据类型等信息要指定齐全
    • overwrite_input:bool值,可省,默认False。指定为True时,直接在输入的数组的内存上以覆盖的方式进行计算。这样做可以减少内存的使用量,但是也可能会改变原油数组中元素的顺序等信息。
    • keepdims:bool值,可省,默认False。为True表示保留原有的维度。

4.2.3 计算元素和

  • np.sum(a, axis=None, dtype=None, out=None, keepdims=False)
    • 参数参看np.mean函数
  • np.ndarray.sum(axis=None, dtype=None, out=None, keepdims=False)

    4.2.4 计算标准差

    1、标准差和无偏标准差

    所谓标准差,时根据数据与其平均值的差值的平方的累加和,然后除以数据个数再取平方根得到结果。可以使用公式得到结果。
    标准差的计算公式为:
    式中, 为标准差; 为数组的平均值。
     
    数据分析: 例如,假设某个平均值为10的数据集合的标准差为5。此时,从统计学角度看,在10-5 ≤ x ≤ 10+5 的范围内包含了整体中68%的数据。 通过这样计算标准差,可以大致从数据的离散程度上看出大部分的数据分布在哪些值的范围之内。

    2、标准差函数np.std

    • np.std(a, axis=None, dtype=None, out=None, ddof=0, keepdims=False)
      • ddof:int类型,可省,默认0。在计算标准差时对数据的个数进行除法运算时,不是使用原本的数据的个数N,而是使用N-ddof进行计算。这样可以增加数据的自由度
      • 其他参数参看np.mean函数
      • ddof是在统计学中起非常重要作用的参数,主要是在计算无偏标准差时,作为ddof=1来使用。 无偏标准差: 无偏标准差时当手头上有从母集中挑选的若干数据时,需要根据手头的数据对母集的标准差进行推测时使用的方法。 其与标准差之间的区别并不仅仅在与分数部分是N还是N-1,而是在统计学上具有重要的意义。 当N足够大时,两者基本上没有什么区别,因此,有时候会在分母中使用N的近似值来计算无偏标准差。

    3、有偏标准差的手动修正

    想要获得样本数据的无偏标准差,直接参数ddof=1来进行计算就可以了,但是对于已存在的(有偏)标准差,如何手动去调整获取它的无偏标准差呢?

    4.2.5 计算方差

    1、方差

    所谓方差,一般是用于表示数据的偏离程度的一个指标。将数据与其平均值的差的平方进行平均后做得到的结果就是方差。方式:
     
    式中,是x的平均值。取这个的平方根所得到的就是标准差。
    之所以要使用标准差,是为了使作为基础数据的单位对齐。如果使用方差,单位就是根据原有数据的单位分别计算平方后所得到的。
    可以看出,要知道平均值与数据的偏离程度,可以根据平均值取方差这一指标来衡量。
    总之,偏离程度的基准点就是平均值。
    无偏方差: 无偏方差与无偏标准差类似,都是根据从母集合中选取的若干数据来对母集合的方差进行推算时所用的值。在这里也是通过将计算方差()的公式中的变成进行计算的。 样本方差 为了将直接使用所指定的数据计算得到的方差与无偏方差进行区分,有时会使用样本方差这一名称。

    2、计算方差

    • np.var(a, axis=None, dtype=None, out=None, ddof=0, keepdims=False)
      • 略,详看4.2.4.
     

    4.2.6 计算协方差

    4.2.7 计算相关系数

    4.3 NumPy中的矩阵运算