前言

不把广播效应算在内,本章的内容很少会改变原始数据本身的shape,所以着重点在于弄明白每个数学函数的使用方法。

1.算数运算

算数运算函数主要有:

  • add():加
  • subtract():减
  • multiply():乘
  • divide():除
  • floor_divide():整除
  • power():a的b次幂
  • sqrt():开根号
  • square():a的平方

举例说明它们的用法:

【例1】算数运算函数实例

>>> a = np.random.randint(1,10,[3,3])
>>> print(a)
[[7 7 2]
 [6 6 7]
 [9 5 7]]
>>> b = np.random.randint(1,10,3)
>>> print(b)
[7 3 7]
#加
>>> print(np.add(a,b))
[[14 10  9]
 [13  9 14]
 [16  8 14]]
#减
>>> print(np.subtract(a,b))
[[ 0  4 -5]
 [-1  3  0]
 [ 2  2  0]]
#乘
>>> print(np.multiply(a,b))
[[49 21 14]
 [42 18 49]
 [63 15 49]]
#除
>>> print(np.divide(a,b))
[[1.         2.33333333 0.28571429]
 [0.85714286 2.         1.        ]
 [1.28571429 1.66666667 1.        ]]
#整除
>>> print(np.floor_divide(a,b))
[[1 2 0]
 [0 2 1]
 [1 1 1]]
#a的b次幂
>>> print(np.power(a,b))
[[ 823543     343     128]
 [ 279936     216  823543]
 [4782969     125  823543]]
#根
>>> print(np.sqrt(a))
[[2.64575131 2.64575131 1.41421356]
 [2.44948974 2.44948974 2.64575131]
 [3.         2.23606798 2.64575131]]
#平方
>>> print(np.square(a))
[[49 49  4]
 [36 36 49]
 [81 25 49]]

2.三角函数

三角函数主要有:

  • sin():正弦
  • cos():余弦
  • tan():正切
  • arcsin():反正弦
  • arccos():反余弦
  • arctan():反正切

以及numpy.degrees()是用来将弧度转为角度,举例说明它们的使用方法:

【例2】三角函数实例

>>> import matplotlib.pyplot as plt
>>> a = np.linspace(0,2 * np.pi,20)
>>> b = np.sin(a)
>>> print(b)
[ 0.00000000e+00  3.24699469e-01  6.14212713e-01  8.37166478e-01
  9.69400266e-01  9.96584493e-01  9.15773327e-01  7.35723911e-01
  4.75947393e-01  1.64594590e-01 -1.64594590e-01 -4.75947393e-01
 -7.35723911e-01 -9.15773327e-01 -9.96584493e-01 -9.69400266e-01
 -8.37166478e-01 -6.14212713e-01 -3.24699469e-01 -2.44929360e-16]
>>> plt.plot(a,b)

在这里插入图片描述

>>> b = np.cos(a)
>>> plt.plot(a,b)

在这里插入图片描述

>>> a = np.linspace(-0.49*np.pi,0.49*np.pi,100)
>>> b = np.tan(a)
>>> plt.plot(a,b)

在这里插入图片描述
这里注意tan()的范围在(-pi/2,pi/2)之间,所以我们有0.49*pi来限定范围。

3.指数和对数

直接上例子说明:

【例3】指数和对数函数实例

>>> a = np.random.randint(1,10,5)
>>> print(a)
[6 5 4 6 3]
#exp e的x次方
>>> print(np.exp(a))
[403.42879349 148.4131591   54.59815003 403.42879349  20.08553692]
#log 以e为底x的对数
>>> print(np.log(a))
[1.79175947 1.60943791 1.38629436 1.79175947 1.09861229]
#log2 以2为底x的对数
>>> print(np.log2(a))
[2.5849625  2.32192809 2.         2.5849625  1.5849625 ]
#log10 以10为底x的对数
>>> print(np.log10(a))
[0.77815125 0.69897    0.60205999 0.77815125 0.47712125]
#exp2 2的x次方
>>> print(np.exp2(a))
[64. 32. 16. 64.  8.]

这里容易混淆的是np.exp2(),因为np.exp()是e的x次方,所以容易把前者跟e联系起来,要注意。

4.加法函数和乘法函数

直接上例子说明:

【例4】加法函数和乘法函数实例

>>> a = np.random.randint(1,10,[4,4])
>>> print(a)
[[2 6 1 9]
 [8 5 2 5]
 [7 6 2 2]
 [5 2 4 2]]
#整和
>>> print(np.sum(a))
68
#沿行求和(列和)
>>> print(np.sum(a,axis=0))
[22 19  9 18]
#沿列求和(行和)
>>> print(np.sum(a,axis=1))
[18 20 17 13]
#累积和(扁平化后)
>>> print(np.cumsum(a))
[ 2  8  9 18 26 31 33 38 45 51 53 55 60 62 66 68]
#沿行求累积和(列累积和)
>>> print(np.cumsum(a,axis=0))
[[ 2  6  1  9]
 [10 11  3 14]
 [17 17  5 16]
 [22 19  9 18]]
#沿列求累积和(行累积和)
>>> print(np.cumsum(a,axis=1))
[[ 2  8  9 18]
 [ 8 13 15 20]
 [ 7 13 15 17]
 [ 5  7 11 13]]
#整积
>>> print(np.prod(a))
580608000
#沿行求积(列积)
>>> print(np.prod(a,axis=0))
[560 360  16 180]
#沿列求积(行积)
>>> print(np.prod(a,axis=1))
[108 400 168  80]
#累积(扁平化后)
>>> print(np.cumprod(a))
[        2        12        12       108       864      4320      8640
     43200    302400   1814400   3628800   7257600  36288000  72576000
 290304000 580608000]
#沿行求累积(列累积)
>>> print(np.cumprod(a,axis=0))
[[  2   6   1   9]
 [ 16  30   2  45]
 [112 180   4  90]
 [560 360  16 180]]
#沿列求累积(行累积)
>>> print(np.cumprod(a,axis=1))
[[  2  12  12 108]
 [  8  40  80 400]
 [  7  42  84 168]
 [  5  10  40  80]]
#沿列求差(相邻行之差)
>>> print(np.diff(a))
[[ 4 -5  8]
 [-3 -3  3]
 [-1 -4  0]
 [-3  2 -2]]
#沿行求差(相邻列之差)
>>> print(np.diff(a,axis=0))
[[ 6 -1  1 -4]
 [-1  1  0 -3]
 [-2 -4  2  0]]

注:上述所有的axis=0其实是沿着行去遍历,但求的是列之间的关系,比如sum中求的是列和,同理axis=1其实是沿着列去遍历,是在求行之间的关系。

5.四舍五入函数

直接上例子说明:

【例5】四舍五入函数实例

>>> a = np.random.rand(3,3)*10
>>> print(a)
[[1.16944655 7.50128062 2.21134653]
 [8.33939104 9.46452031 4.58700646]
 [5.15796925 4.75485535 6.39179018]]
#四舍五入
>>> print(np.around(a))
[[1. 8. 2.]
 [8. 9. 5.]
 [5. 5. 6.]]
#向上取整
>>> print(np.ceil(a))
[[ 2.  8.  3.]
 [ 9. 10.  5.]
 [ 6.  5.  7.]]
#向下取整
>>> print(np.floor(a))
[[1. 7. 2.]
 [8. 9. 4.]
 [5. 4. 6.]]

6.统计函数

NumPy 提供了很多统计函数,用于从数组中查找最小元素,最大元素,百分位标准差和方差等。包括:

  • amin():沿指定轴的最小值
  • amax():沿指定轴的最大值
  • ptp():沿指定轴的最小值与最大值之差
  • percentile():统计中使用的度量
  • median():计算数组 a 中元素的中位数
  • mean():返回数组中元素的算术平均值
  • average():根据在另一个数组中给出的各自的权重计算数组中元素的加权平均值
  • std():标准差
  • var():方差

【例6-1】一般统计函数实例

>>> a = np.random.randint(1,10,[5,5])
>>> print(a)
[[2 8 3 2 6]
 [6 8 7 4 8]
 [2 3 7 9 4]
 [1 2 1 9 7]
 [9 7 3 6 2]]
#沿第一维度的最小值
>>> print(np.amin(a,axis=0))
[1 2 1 2 2]
#沿第一维度的最大值
>>> print(np.amax(a,axis=0))
[9 8 7 9 8]
#沿第一维度的最小值与最大值之差
>>> print(np.ptp(a,axis=0))
[8 6 6 7 6]
#沿第一维度中位数
>>> print(np.median(a,axis=0))
[2. 7. 3. 6. 6.]
#沿第一维度算术平均值
>>> print(np.mean(a,axis=0))
[4.  5.6 4.2 6.  5.4]
#沿第一维度标准差
>>> print(np.std(a,axis=0))
[3.03315018 2.57681975 2.4        2.75680975 2.15406592]
#沿第一维度方差
>>> print(np.var(a,axis=0))
[9.2  6.64 5.76 7.6  4.64]

这里重点讲一下percentile()average():

在这里插入图片描述在这里插入图片描述

百分位数是统计中使用的度量,表示小于这个值的观察值的百分比,举例说明:

【例6-2】percentile()函数实例

>>> a = np.array([[10, 7, 4], [3, 2, 1]])
>>> print(a)
[[10  7  4]
 [ 3  2  1]]
>>> print(np.percentile(a, 50))
3.5
>>> print(np.percentile(a, 70))
5.5
>>> print(np.percentile(a, 50, axis=0))
[6.5 4.5 2.5]
>>> print(np.percentile(a, 50, axis=1))
[7. 2.]
>>> print(np.percentile(a, 50, axis=1, keepdims=True))
[[7.]
 [2.]]

我们以np.percentile(a, 70)为例,探究其计算方式:

  1. (数组长度-1)* 百分比 = (6-1) * 70% = 3.5 = a+b
  2. a = 3,b = 0.5
  3. result = (1 - b)× arr[a] + b x arr[a+1] = 0.5 * 4 + 0.5 * 7 = 5.5

即为所求。

numpy.average() 函数根据在另一个数组中给出的各自的权重计算数组中元素的加权平均值。

该函数可以接受一个轴参数。 如果没有指定轴,则数组会被展开。

加权平均值即将各数值乘以相应的权数,然后加总求和得到总体值,再除以总的单位数。

【例6-3】average()函数实例

# 不指定权重时相当于 mean 函数
>>> a = np.array([1,2,3,4])  
>>> print (a)
[1 2 3 4]

>>> print (np.average(a))
2.5
>>> print (np.mean(a))
2.5
# 指定权重
>>> wts = np.array([4,3,2,1])  
>>> print (np.average(a,weights = wts))
2.0
# 如果 returned 参数设为 true,则返回权重的和  
>>> print (np.average([1,2,3,4],weights =  [4,3,2,1], returned =  True))
(2.0, 10.0)

考虑数组[1,2,3,4]和相应的权重[4,3,2,1],利用average()函数将相应元素的乘积相加,并将和除以权重的和,来计算加权平均值。

7.杂项

【例7】clip等实例

>>> a = np.random.randint(-5,5,[5,5])
>>> print(a)
>>> print(np.clip(a,a_min=-2,a_max=3))
>>> print(np.abs(a))
>>> print(np.absolute(a))
>>> print(np.sign(a))

np.clip是用来替换的,将小于a_min的值换成a_min,将大于a_max的值换成a_max。

np.abs和np.absolute的功能类似,返回元素的绝对值。

np.sign类似于符号函数,负数返回-1,正数返回1,零返回0。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐