【画学numpy】5.numpy数组运算

本文是画学numpy系列文章之一
⭐️github:drawing_and_studying_numpy包含了可以运行的notebook文件以及本文绘制的所有插图。
也可以选择在百度的AI studio【画学numpy】上运行notebook代码

画学numpy系列文章目录:

  • 【画学numpy】介绍
  • 【画学numpy】1.numpy数组初识
  • 【画学numpy】2.numpy数组创建
  • 【画学numpy】3.numpy数组操作
  • 【画学numpy】4.numpy数组索引
  • 【画学numpy】5.numpy数组运算

numpy数组运算

【画学numpy】5.numpy数组运算_第1张图片

import numpy as np
print(np.__version__)
1.22.3

基本运算

四则运算:(+-*/)
以及求模(%)、取整(//) 、乘方(**)

比较运算:==, !=, >, <, >=, <=

矩阵乘法:@

四则运算

一维数组与标量相加

a = np.array([0, 1, 2, 3])
a + 5
array([5, 6, 7, 8])

一维数组求模

a % 2
array([0, 1, 0, 1], dtype=int32)

两个长度相同的一维数组相减

a2 = np.array([2, 4, 6, 8])
a2 - a
array([2, 3, 4, 5])

二维数组与标量相乘

b = np.array([[ 2, 4,  6],
              [ 4, 8, 12]])
b * 3
array([[ 6, 12, 18],
       [12, 24, 36]])

两个形状相同的二维数组相乘

b2 = np.array([[0, 1, 2],
               [3, 4, 5]])
b * b2
array([[ 0,  4, 12],
       [12, 32, 60]])

二维数组除一行

a3 = np.array([1, 2, 3])
b / a3
array([[2., 2., 2.],
       [4., 4., 4.]])

二维数组除一列

b3 = np.array([[2],
               [4]])
b / b3
array([[1., 2., 3.],
       [1., 2., 3.]])

取整、乘方略,计算规律同上
【画学numpy】5.numpy数组运算_第2张图片

比较运算

一维数组与标量比较

a = np.array([0, 1, 2, 3])
a == 2
array([False, False,  True, False])

二维数组与一列比较

b5 = np.array([[3],
               [30]])

b >= b5
array([[False, False,  True,  True],
       [False, False,  True,  True]])

两个形状相同的二维数组比较

b = np.array([[ 1,  2,  3,  4],
              [10, 20, 30, 40]])

b4 = np.array([[  0, 5,  0, 5],
               [ 50, 0, 50, 0]])
b < b4
array([[False,  True, False,  True],
       [ True, False,  True, False]])

【画学numpy】5.numpy数组运算_第3张图片

矩阵乘法

a = np.array([1, 2, 3])
b = np.array([[1, 2],
              [3, 4],
              [5, 6]])

a @ b
array([22, 28])
a.dot(b)
array([22, 28])
np.dot(a, b)
array([22, 28])

【画学numpy】5.numpy数组运算_第4张图片

常量

圆周率 π

np.pi
3.141592653589793

自然对数 e

np.e
2.718281828459045

常用运算函数

常用的运算函数,会对数组中的每个元素执行运算

  • np.sqrt(arr): 开二次根号
  • np.square(arr): 求平方相当于arr ** 2
  • np.sin(arr): sin函数
  • np.cos(arr): cos函数
  • np.exp(arr): e的次幂
  • np.log(arr): 以e为底的对数
a = np.array([1, 2, 3, 4])
np.square(a)
array([1.        , 1.41421356, 1.73205081, 2.        ])
b = np.array([[ 1,  4,  9],
              [16, 25, 36]])
np.sqrt(b)
array([[1., 2., 3.],
       [4., 5., 6.]])

其他函数的使用同上,会对数组的每个元素应用相应的运算函数。
【画学numpy】5.numpy数组运算_第5张图片

常用统计函数

常用的统计函数,统计函数和运算函数的一大区别是:

运算函数计算的结果与原数组的形状一样,而统计函数计算结果数组形状与原数组不一样

  • ndarray.max(): 求数组最大值
  • ndarray.min(): 求数组最小值
  • ndarray.mean(): 求数组均值
  • ndarray.std(): 求数组标准差
  • ndarray.var(): 求数组方差
  • ndarray.sum(): 数组求和
  • ndarray.argmax(): 求数组最大值所在的位置
  • ndarray.argmin(): 求数组最小值所在的位置
    上面这些函数,用法都大差不差。它们都有axis这个参数,主要就是控制这个参数。

因此只需要掌握参数axis的对数组计算结果有何影响即可。

如果不指定轴axis,默认对整个数组计算统计量

axis=None

下面以一个二维数组来举例

b = np.array([[ 1,  3,  5],
              [30, 50, 10],
              [25, 15,  5]])

print('b.max():', b.max())
print('b.min():', b.min())
print('b.mean():', b.mean())
print('b.std():', b.std())
print('b.var():', b.var())
print('b.sum():', b.sum())
print('b.argmax():', b.argmax())
print('b.argmin():', b.argmin())
b.max(): 50
b.min(): 1
b.mean(): 16.0
b.std(): 15.297058540778355
b.var(): 234.0
b.sum(): 144
b.argmax(): 4
b.argmin(): 0

这里需要单独解释一下argmax()argmin()函数,这两个函数分别表示数组中最大值、最小值所在的位置。

  • b.argmax(): 4就表示:数组b中,最大值是第4个(从0开始数)元素。也就是50
  • b.argmin(): 0就表示:数组b中,最小值是第0个(从0开始数)元素。也就是1

【画学numpy】5.numpy数组运算_第6张图片

为避免冗余,下面用max()argmax()来展现更改axis带来的效果

axis=1

回忆之前的右下里原则,这里是二维数组,那么axis=1表示方向向右

也就是沿着向右的方向来计算统计值

可以理解为计算每一最大值(max),和最大值所在的位置(argmax)

b
array([[ 1,  3,  5],
       [30, 50, 10],
       [25, 15,  5]])
print("b.max(axis=1):", b.max(axis=1))
print("b.argmax(axis=1):", b.argmax(axis=1))
b.max(axis=1): [ 5 50 25]
b.argmax(axis=1): [2 1 0]

上面的结果就表示,每一行的最大值分别为5、50和25

最大值所在的位置分别为第2个、第1个、和第0个

axis=0

axis=0表示方向向下

可以理解为计算每一最大值(max),和最大值所在的位置(argmax)

print("b.max(axis=0):", b.max(axis=0))
print("b.argmax(axis=0):", b.argmax(axis=0))
b.max(axis=0): [30 50 10]
b.argmax(axis=0): [1 1 1]

【画学numpy】5.numpy数组运算_第7张图片

此外,也可以用np.max()的形式求统计值,差别在于使用np.max()时,第一个参数要填数组,其他完全一致

以下几种写法是等价的:

print(np.max(b)  ==  b.max())
print(np.argmax(b, axis=1) == b.argmax(axis=1))
True
[ True  True  True]

小结

【画学numpy】5.numpy数组运算_第8张图片

回到初始介绍:【画学numpy】介绍

你可能感兴趣的:(python,机器学习,深度学习,数据分析,数据挖掘)