在Python中,使用NumPy包和SciPy包可以实现大多数线性代数运算。本节介绍矩阵行列式、向量运算、矩阵运算和矩阵分解等内容。[大谦Excel,dqexcel点com]
行列式
使用numpy.linalg子包的det函数计算指定矩阵的行列式。
如图6-7所示,打开Excel 365后,在A1:C3单元格区域中输入矩阵数据,用鼠标单击F1单元格,在公式文本框中输入“=PY(”进入Python模式。在公式文本框中输入下面的代码:
a=xl("A1:C3").values
np.linalg.det(a)
单击Ctrl+Enter键,F1单元格中输出矩阵的行列式的值如图6-7所示。注意,xl(‘A1:C3’)返回的是一个DataFrame,即带索引的二维数组。用DataFrame对象的values属性,获取该对象的值。
在A5:C7单元格区域中输入第2个矩阵数据,用鼠标单击F5单元格,在公式文本框中输入“=PY(”进入Python模式。在公式文本框中输入下面的代码:
a=xl("A5:C7").values
np.linalg.det(a)
单击Ctrl+Enter键,F5单元格中输出第2个矩阵的行列式的值如图6-7所示。因为第2个矩阵是一个奇异矩阵,它的行列式的值为0。
图6-7 求矩阵的行列式
向量运算
向量、矩阵和数组这几个概念大家要搞清楚。向量和矩阵是数学概念,数组是计算机概念。它们之间的对应关系是,向量是一维数组,包括行向量和列向量等;矩阵是二维数组。Series和DataFrame则是带索引的一维数组和二维数组,是结构化数组。
如图6-8所示,首先打开Excel 365,在A1:E1单元格区域中输入第1个向量的值,在A2:E2单元格区域中输入第2个向量的值,用鼠标单击B4单元格,在公式文本框中输入“=PY(”进入Python模式。在公式文本框中输入下面的代码:
x=xl("A1:E1")
y=xl("A2:E2")
x=x.values[0]
y=y.values[0]
x+y
单击Ctrl+Enter键,B4单元格中输出向量相加的结果如图6-8所示。
注意,xl(“A1:E1”)返回的是一个DataFrame,不是向量。利用DataFrame对象的values属性返回一个二维数组,用[0]进一步索引,得到二维数组里面的第1个元素,它是我们需要的向量。
图6-8 向量运算
用鼠标单击B5单元格,在公式文本框中输入“=PY(”进入Python模式。在公式文本框中输入下面的代码:
x=xl("A1:E1")
y=xl("A2:E2")
x=x.values[0]
y=y.values[0]
x-y
单击Ctrl+Enter键,B5单元格中输出向量相减的结果如图6-8所示。
用鼠标单击B6单元格,在公式文本框中输入“=PY(”进入Python模式。在公式文本框中输入下面的代码:
x=xl("A1:E1")
x=x.values[0]
x*10
单击Ctrl+Enter键,B6单元格中输出向量乘以常数的结果如图6-8所示。
用鼠标单击B7单元格,在公式文本框中输入“=PY(”进入Python模式。在公式文本框中输入下面的代码:
x=xl("A1:E1")
y=xl("A2:E2")
x=x.values[0]
y=y.values[0]
np.dot(x,y)
单击Ctrl+Enter键,B6单元格中输出两个向量点乘的结果如图6-8所示。注意,点乘是将两个向量的对应元素相乘,然后将所有乘积相加。
6.2.3矩阵的四则运算
矩阵的四则运算包括矩阵相加、相减、相乘、点乘、相除和点除等运算,其中点乘和点除是将矩阵的对应元素相乘和相除。
如图6-9所示,首先打开Excel 365,在A1:B2单元格区域中输入第1个矩阵[[1 3],[4 6]],在D1:E2单元格区域中输入第2个矩阵[[6 1],[9 3]],用鼠标单击B4单元格,在公式文本框中输入“=PY(”进入Python模式。在公式文本框中输入下面的代码:
x=xl("A1:B2").values
y=xl("D1:E2").values
np.add(x,y)
单击Ctrl+Enter键,B4单元格中输出两个矩阵相加的结果如图6-9所示。
图6-9 矩阵的四则运算
用鼠标单击B5单元格,在公式文本框中输入“=PY(”进入Python模式。在公式文本框中输入下面的代码:
x=xl("A1:B2").values
y=xl("D1:E2").values
np.subtract(x,y)
单击Ctrl+Enter键,B5单元格中输出两个矩阵相减的结果如图6-9所示。
用鼠标单击B6单元格,在公式文本框中输入“=PY(”进入Python模式。在公式文本框中输入下面的代码:
x=xl("A1:B2").values
y=xl("D1:E2").values
np.multiply(x,y)
单击Ctrl+Enter键,B6单元格中输出两个矩阵点乘的结果如图6-9所示。
用鼠标单击B7单元格,在公式文本框中输入“=PY(”进入Python模式。在公式文本框中输入下面的代码:
x=xl("A1:B2").values
y=xl("D1:E2").values
np.dot(x,y)
单击Ctrl+Enter键,B7单元格中输出两个矩阵相乘的结果如图6-9所示。
用鼠标单击B8单元格,在公式文本框中输入“=PY(”进入Python模式。在公式文本框中输入下面的代码:
x=xl("A1:B2").values
y=xl("D1:E2").values
np.divide(x,y)
单击Ctrl+Enter键,B8单元格中输出两个矩阵点除的结果如图6-9所示。
用鼠标单击B9单元格,在公式文本框中输入“=PY(”进入Python模式。在公式文本框中输入下面的代码:
x=xl("A1:B2").values
y=xl("D1:E2").values
z=np.linalg.inv(x)
np.dot(z,y)
单击Ctrl+Enter键,B9单元格中输出两个矩阵相除的结果如图6-9所示。注意,Python中并没有直接求矩阵相除的函数,实现矩阵相除,是先求x矩阵的逆矩阵,然后用该逆矩阵乘以y矩阵。
6.2.4更多矩阵运算
本小节继续介绍矩阵转置、矩阵求逆和矩阵重塑等常见操作。
如图6-10所示,首先打开Excel 365,在A1:C3单元格区域中输入第1个矩阵[[1 2 0],[2 5 -1],[4 10 -1]],在E1:H3单元格区域中输入第2个矩阵[[1 4 7 10],[2 5 8 11],[3 6 9 12]],用鼠标单击B5单元格,在公式文本框中输入“=PY(”进入Python模式。在公式文本框中输入下面的代码:
a=xl("A1:C3").values
np.transpose(a)
单击Ctrl+Enter键,B5单元格中输出第1个矩阵转置后的结果如图6-10所示。
图6-10 矩阵的转置、求逆和重塑运算
用鼠标单击B6单元格,在公式文本框中输入“=PY(”进入Python模式。在公式文本框中输入下面的代码:
a=xl("A1:C3").values
np.linalg.inv(a)
单击Ctrl+Enter键,B6单元格中输出第1个矩阵的逆矩阵如图6-10所示。
用鼠标单击B7单元格,在公式文本框中输入“=PY(”进入Python模式。在公式文本框中输入下面的代码:
a=xl("E1:H3").values
np.reshape(a,[2,6])
单击Ctrl+Enter键,B7单元格中输出第2个矩阵重塑为2行6列矩阵的结果如图6-10所示。
6.2.5矩阵的分解
本小节介绍矩阵分解中常见的LU分解和QR分解。LU分解是线性方程组的求解方法中高斯消去法的基础,它将方程组的系数矩阵分解为上三角矩阵和下三角矩阵。QR分解将实数矩阵分解为Q矩阵和R矩阵,其中Q矩阵为正交矩阵,R为上三角矩阵。
如图6-11所示,首先打开Excel 365,在A1:C3单元格区域中输入矩阵[[1 2 0],[2 5 -1],[4 10 -1]],用鼠标单击B5单元格,在公式文本框中输入“=PY(”进入Python模式。在公式文本框中输入下面的代码:
import scipy as sp
a=xl("A1:C3").values
r=sp.linalg.lu(a)
单击Ctrl+Enter键,B5单元格中输出矩阵LU分解的结果如图6-11所示。
图6-11 矩阵分解
用鼠标单击B6单元格,在公式文本框中输入“=PY(”进入Python模式。在公式文本框中输入下面的代码:
import scipy as sp
a=xl("A1:C3").values
r=sp.linalg.qr(a)
单击Ctrl+Enter键,B6单元格中输出矩阵QR分解的结果如图6-11所示。