我的知识记录

digSelf

机器学习基础:使用NumPy做算术运算和矩阵运算

2021-10-31
机器学习基础:使用NumPy做算术运算和矩阵运算

创建NumPy数组的目的就是为了运算,因此理解在NumPy中如何进行数学运算和线性代数运算,以及如何使用NumPy做上述运算是十分必要的...

算术运算(Arithmetic)

基本算术运算

使用NumPy的目的之一是进行多维数据的数学运算。由于在NumPy中,针对NumPy中的数组重载了一些算术运算符,因此我们可以仅仅通过一个运算符就可以对NumPy数组中的每个元素进行相应的数学运算。

下列代码示例展示了如何对NumPy数组中的多维数据进行数学运算:

arr = np.array([[1, 2], [3, 4]])
# Add 1 to element values
print(repr(arr + 1))
# Subtract element values by 1.2
print(repr(arr - 1.2))
# Double element values
print(repr(arr * 2))
# Halve element values
print(repr(arr / 2))
# Integer division (half)
print(repr(arr // 2))
# Square element values
print(repr(arr**2))
# Square root element values
print(repr(arr**0.5))

由于重载了一些算数运算符,我们就可以简化代码,而不用自己写循环去按照某些规则更新数组中的每一个位置的值。需要注意的是:在NumPy数组中执行算数运算,并不是在原来的数组中直接修改,而是产生了一个新的数组,这个数组是由所执行的算数运算的结果所构成的。

非线性运算

Numpy数组除了可以进行基础的算数运算,还可以计算非线性运算,如:对数运算和指数运算

arr = np.array([[1, 2], [3, 4]])
# Raised to power of e
print(repr(np.exp(arr)))
# Raised to power of 2
print(repr(np.exp2(arr)))

arr2 = np.array([[1, 10], [np.e, np.pi]])
# Natural logarithm
print(repr(np.log(arr2)))
# Base 10 logarithm
print(repr(np.log10(arr2)))

np.exp是以e为指数的指数运算,它将数组中的每个元素都做了$xe$运算;np.exp2是以2为指数的指数运算,它将数组中的每个元素都做了$x2$的操作。而np.log, np.log2np.log10分别将数组中的元素做以e,210为底数的对数运算。其中:np.enp.pi分别表示数学中的$e$和$\pi$。

如果想做任意指数的指数运算,可以使用np.power函数,它的第一个参数是底数(base),第二个参数是指数(power)。如果底数或者指数不是一个数而是一个数组,则对于数组中中的每一个元素做相应的操作,即:如果两个都是形状相同的数组,则对应位置的元素做指数运算;如果一个是数组,另一个是数值,则对于数组中的每个元素做指数运算。下面为np.power的使用示例:

arr = np.array([[1, 2], [3, 4]])
# Raise 3 to power of each number in arr
print(repr(np.power(3, arr)))
arr2 = np.array([[10.2, 4], [3, 5]])
# Raise arr2 to power of each number in arr
print(repr(np.power(arr2, arr)))

矩阵乘法

由于NumPy数组可以视为是一个向量或者矩阵,那么向量或者矩阵的乘法也是有意义的。使用np.matmul表示做矩阵的乘法,这个函数的作用是做点乘或者矩阵的乘法,即:当输入的两个参数都是一维向量时,该函数做内积运算,输出的是一个数;如果两个参数都是矩阵或者一个向量一个矩阵,做的就是矩阵乘法。

在使用上述函数时,需要注意要严格符合矩阵乘法的定义,否则会抛出ValueError异常。

arr1 = np.array([1, 2, 3])
arr2 = np.array([-3, 0, 10])
print(np.matmul(arr1, arr2))

arr3 = np.array([[1, 2], [3, 4], [5, 6]])
arr4 = np.array([[-1, 0, 1], [3, 2, -4]])
print(repr(np.matmul(arr3, arr4)))
print(repr(np.matmul(arr4, arr3)))
# This will result in ValueError
print(repr(np.matmul(arr3, arr3)))
  • 0