数据科学和机器学习所需的数学知识中,约有30-40%来自线性代数。矩阵运算在线性代数中占有重要的地位。Numpy通常用于在Python中执行数值计算,并且对于矩阵操作做了特殊的优化。numpy通过向量化避免许多for循环来更有效地执行矩阵操作。
我将包括本文中讨论的每个矩阵操作的含义、背景描述和代码示例。本文末尾的“关键要点”一节将提供一些更具体矩阵操作的简要总结。所以,一定要阅读这部分内容。
我将按照以下顺序讨论每个矩阵操作。
- 内积
- 点积
- 转置
- 迹
- 秩
- 行列式
- 逆
- 伪逆
- 扁平化
- 特征值和特征向量
内积 Inner product
内积接收两个大小相等的向量,并返回一个数字(标量)。这是通过将每个向量中相应的元素相乘并将所有这些乘积相加来计算的。在numpy中,向量被定义为一维numpy数组。
为了得到内积,我们可以使用np.inner()。对于1维向量np.dot()和np.inner()是相同的两者都给出了相同的结果(np文档中有详细描述,大意是对于2-D数组,它等效于矩阵乘法,对于1-D数组,其等效于向量的内积)。这些函数的输入是两个向量它们的大小应该是一样的。
importnumpyasnp#Vectorsas1Dnumpyarraysa=np.array([1, 2, 3]) b=np.array([4, 5, 6]) print("a= ", a) print("b= ", b) print("\ninner:", np.inner(a, b)) print("dot:", np.dot(a, b))
点积 Dot product
点积是为矩阵定义的。它是两个矩阵中相应元素的乘积的和。为了得到点积,第一个矩阵的列数应该等于第二个矩阵的行数。
有两种方法可以在numpy中创建矩阵。最常见的一种是使用numpy ndarray类。这里我们创建了二维numpy数组(ndarray对象)。另一种方法是使用numpy矩阵类。
ndarray和matrix对象的点积都可以使用np.dot()得到。
importnumpyasnp#Matricesasndarrayobjectsa=np.array([[1, 2], [3, 4]]) b=np.array([[5, 6, 7], [8, 9, 10]]) print("a", type(a)) print(a) print("\nb", type(b)) print(b) #Matricesasmatrixobjectsc=np.matrix([[1, 2], [3, 4]]) d=np.matrix([[5, 6, 7], [8, 9, 10]]) print("\nc", type(c)) print(c) print("\nd", type(d)) print(d) print("\ndot product of two ndarray objects") print(np.dot(a, b)) print("\ndot product of two matrix objects") print(np.dot(c, d))
当使用*操作符将两个ndarray对象相乘时,结果是逐元素相乘。另一方面,当使用*操作符将两个矩阵对象相乘时,结果是点(矩阵)乘积,相当于前面的np.dot()。
importnumpyasnp#Matricesasndarrayobjectsa=np.array([[1, 2], [3, 4]]) b=np.array([[5, 6], [8, 9]]) print("a", type(a)) print(a) print("\nb", type(b)) print(b) #Matricesasmatrixobjectsc=np.matrix([[1, 2], [3, 4]]) d=np.matrix([[5, 6], [8, 9]]) print("\nc", type(c)) print(c) print("\nd", type(d)) print(d) print("\n* operation on two ndarray objects (Elementwise)") print(a*b) print("\n* operation on two matrix objects (same as np.dot())") print(c*d)
转置
矩阵的转置是通过行与列的交换得到的。我们可以使用np.transpose()函数或NumPy ndarray.transpose()方法或ndarray。T(一种不需要括号的特殊方法)来求转置。它们都给出相同的输出。
importnumpyasnpa=np.array([[1, 2], [3, 4], [5, 6]]) print("a = ") print(a) print("\nWith np.transpose(a) function") print(np.transpose(a)) print("\nWith ndarray.transpose() method") print(a.transpose()) print("\nWith ndarray.T short form") print(a.T)
转置也可以应用到向量上。但是,从技术上讲,一维numpy数组不能转置。
importnumpyasnpa=np.array([1, 2, 3]) print("a = ") print(a) print("\na.T = ") print(a.T)