由于需要求数组的逆,而numpy.ndarray不能直接求逆,需要先转换为numpy.matrix类型。
ndarray转matrix:

x = np.mat(x)

matrix转ndarray:

x = x.A

需要注意的是,matrix 只能表示二维数据,用其他维度的ndarray转换为matrix后,再进行维度的变换。

顺便附上矩阵求逆:

x = x.I

矩阵转置

x = x.T

后续发现numpy 和 matrix 在计算时差别很大,故做个总结

1.生成矩阵

a = np.array([[1,2],[3,4]])
b = np.mat([[1,2],[3,4]])
print(type(a), a)
print(type(b), b)

结果为:

<class 'numpy.ndarray'> [[1 2]
 [3 4]]
<class 'numpy.matrix'> [[1 2]
 [3 4]]

2.matrix()和 array ()函数都可以通过对象后面加上 .T 得到其转置。但是matrix()还可以在后面加 .H 得到共轭矩阵, 加 .I 得到逆矩阵, array()就不可以

print(a.T)
print(b.T)
print(b.H)
print(b.I)

结果为:

[[1 3]
 [2 4]]
[[1 3]
 [2 4]]
[[1 3]
 [2 4]]
[[-2.   1. ]
 [ 1.5 -0.5]]

3.互相转换:

a1 = np.mat(a)
b1 = b.getA()
b2 = np.asarray(b)
print(type(a1), a1)
print(type(b1), b1)
print(type(b2), b2)

结果为:

<class 'numpy.matrix'> [[1 2]
 [3 4]]
<class 'numpy.ndarray'> [[1 2]
 [3 4]]
<class 'numpy.ndarray'> [[1 2]
 [3 4]]

4.乘法
(1). np.multiply,对 array 和 matrix 对象的操作相同
维度相同,都是每行对应元素相乘,不求和。
对于两个矩阵元素维度不一的情况(array 和 matrix 对象都适用),则需将相应的行和列进行扩充,需要扩充的行或列的维度必须为 1。
对列扩充则补 1, 对行扩充则将第一行复制到每一行。比如,x:3 * 1, y: 1 * 2,则 x 扩充为 3 * 2,y 扩充为 3 * 2。
如下所示:

x = np.array([[1],[1],[1]])
y = np.array([1,2])
print(np.multiply(x,y))

结果为:

[[1 2]
 [1 2]
 [1 2]]

x 和 y为标量:则标量直接相乘

(2) .*
(1)对于 matrix 对象,代表矩阵乘法(维度必须满足相应规则);
(2)对于array对象,则是每行对应元素相乘。当 array 对象的 shape 不同时(matrix 对象不行) ,其规则和 np.multiply 一样;

print(a*a)
print(b*b)
print(x*y)

结果为:

[[ 1  4]
 [ 9 16]]
[[ 7 10]
 [15 22]]
[[1 2]
 [1 2]
 [1 2]]

(3) .np.matmul
该函数对 array 和 matrix 对象的操作是不一样的。
(1)对于 matrix 对象,对应矩阵乘法,对象维度必须满足矩阵乘法规则。
(2)对于 array 对象,对应内积,但对象维度必须相同,不支持维度扩展。
(3)不支持标量运算。
在array 中,与 multiply 一样,每行对应元素相乘

print(np.matmul(a,a))
print(np.matmul(b,b))

结果为:

[[ 7 10]
 [15 22]]
[[ 7 10]
 [15 22]]

(4) .np.dot
对于matrix 对象,对应矩阵乘法。
对于两个 array 类型的元素:a,b,有如下可能:
(1)a 和 b 都是一维 array,那么 dot 就是它们的内积(点乘);
(2)a 和 b 都是二维 array,那么 dot 就是它们的矩阵乘积(即按矩阵乘法规则来计算),也可以用 matmul 或 a @ b;
(3)如果a 和 b 都是标量(scalar),那么 dot 就是两个数的乘积,也可以用 multiply 或 a * b;
(4)若 a:N * D,b:1 * D,那么 dot 为 a 的每一行和 b (只有一行)的 内积;