关于numpy矩阵运算的小记
[toc]
发现做矩阵处理是numpy忘了好多,所以记录下来.
array与matrix
matrix是array的分支,matrix和array在很多时候都是通用的,你用哪一个都一样。但这时候,官方建议大家如果两个可以通用,那就选择array,因为array更灵活,速度更快,很多人把二维的array也翻译成矩阵。
但是matrix的优势就是相对简单的运算符号,比如两个矩阵相乘,就是用符号*
,但是array相乘不能这么用,得用方法.dot()
array的优势就是不仅仅表示二维,还能表示3、4、5…维,而且在大部分Python程序里,array也是更常用的。
1 2 3 4 5 6 7 8 9 10 11 12
| import numpy as np
a1 = np.array([[1, 2], [3, 4]]) a2 = np.array([[5, 6], [7, 8]]) b1 = np.mat([[1, 2], [3, 4]]) b2 = np.mat([[5, 6], [7, 8]])
print((np.dot(a1, a2)).all() == (b1 * b2).all())
|
输出
True
矩阵判等
在矩阵判等中存在各个元素相等和整个矩阵相等两种情况
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| import numpy as np
a1 = np.array([[1, 2], [3, 4]]) a2 = np.array([[5, 6], [7, 8]]) b1 = np.mat([[1, 2], [3, 4]]) b2 = np.mat([[5, 6], [7, 8]]) print('np.dot(a1, a2):\n', np.dot(a1, a2)) print('b1 * b2:\n', b1 * b2) print((np.dot(a1, a2)) == (b1 * b2)) print((np.dot(a1, a2)).all() == (b1 * b2).all())
|
输出:

其中==
用于判等各个元素相等,用all()
方法可以判断整个矩阵相等
矩阵的连接
在numpy中存在按行连接与按列连接两种形式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| import numpy as np
x = np.array([[1, 2, 3], [4, 5, 6]]) print("x:\n", x)
y = np.array([[7, 8, 9], [10, 11, 12]]) print("y:\n", y)
z = np.array([[13, 14, 15]]) print("z:\n", z)
a = np.vstack((x, y, z)) print('np.vstack((x,y,z)):\n', a) b = np.hstack((x, y)) print('np.hstack((x,y)):\n', b)
|
输出:

其中np.hstack()是按行连接:行数相同的的连接在一起;np.vstack()按列连接:列书相同的连接在一起。
矩阵的向量化
在矩阵中我们可以使用reshape
方法来实现矩阵的向量化,如果在整形操作中将尺寸标注为-1,则会自动计算其他尺寸
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| import numpy as np
x = np.array([[1, 2, 3], [4, 5, 6]]) print("x:\n", x)
y = np.array([[7, 8, 9], [10, 11, 12]]) print("y:\n", y)
z = np.array([[13, 14, 15]]) print("z:\n", z)
a = np.vstack((x, y, z)) print('np.vstack((x,y,z)):\n', a) b = np.hstack((x, y)) print('np.hstack((x,y)):\n', b)
print(a.shape) print(a.reshape(-1,1))
|
输出:

矩阵的拆分
使用hsplit
,您可以沿数组的水平轴拆分数组,方法是指定要返回的形状相同的数组的数量,或者指定要在其后进行划分的列,使用vsplit
,您可以沿数组的竖直轴拆分数组,方法是指定要返回的形状相同的数组的数量,或者指定要在其后进行划分的列。
1 2 3 4 5 6 7 8
| import numpy as np
a = np.array([[1, 1, 2, 3], [1, 5, 7, 3], [7, 3, 9, 3], [1, 7, 3, 0]]) print(np.hsplit(a, 2)) print(np.vsplit(a, 2))
|

矩阵的复制
用=
的简单分配不会复制数组对象或其数据,该copy
方法对数组及其数据进行完整复制。
1 2 3 4 5 6 7 8 9 10 11 12 13
| import numpy as np
a = np.array([[1, 1, 2, 3], [1, 5, 7, 3], [7, 3, 9, 3], [1, 7, 3, 0]])
b = a print(id(a)) print(id(b)) c = a.copy() print(id(c))
|
矩阵的逆
利用numpy.linalg.inv()
可以求得矩阵的逆矩阵
1 2 3 4 5 6 7 8 9
| import numpy as np
a = np.array([[1, 1, 2, 3], [1, 5, 7, 3], [7, 3, 9, 3], [1, 7, 3, 0]])
b = np.linalg.inv(a) print(np.dot(a, b))
|

矩阵的索引
1 2 3 4 5 6 7 8 9 10 11 12 13
| import numpy as np
a = np.array([[1, 1, 2, 3], [1, 5, 7, 3], [7, 3, 9, 3], [1, 7, 3, 0]])
print(a[2, 3]) print(a[1:]) print(a[1:3]) print(a[:, 1]) print(a[0:3, 1]) print(type(a[:3]))
|