关于numpy矩阵运算的小记
发现做矩阵处理是numpy忘了好多,所以记录下来.
array与matrix
matrix是array的分支,matrix和array在很多时候都是通用的,你用哪一个都一样。但这时候,官方建议大家如果两个可以通用,那就选择array,因为array更灵活,速度更快,很多人把二维的array也翻译成矩阵。
但是matrix的优势就是相对简单的运算符号,比如两个矩阵相乘,就是用符号*
,但是array相乘不能这么用,得用方法.dot()
array的优势就是不仅仅表示二维,还能表示3、4、5…维,而且在大部分Python程序里,array也是更常用的。
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
矩阵判等
在矩阵判等中存在各个元素相等和整个矩阵相等两种情况
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中存在按行连接与按列连接两种形式
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,则会自动计算其他尺寸
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
,您可以沿数组的竖直轴拆分数组,方法是指定要返回的形状相同的数组的数量,或者指定要在其后进行划分的列。
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
方法对数组及其数据进行完整复制。
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))
b = a
print(id(a))
print(id(b))
c = a.copy()
print(id(c))
矩阵的逆
利用numpy.linalg.inv()
可以求得矩阵的逆矩阵
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))
矩阵的索引
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]) # 输出第2+1行第3+1列的数字
print(a[1:]) # 以矩阵形式输出从第1+1行开始的所有数
print(a[1:3]) # 以矩阵形式输出第1+1到第3+1-1行的数
print(a[:, 1]) # 输出矩阵的第1+1列的所有数
print(a[0:3, 1]) # 输出矩阵从0+1行到第3+1-1行的第1+1列的所有数
print(type(a[:3]))