提示:本文将matlab的矩阵向量运算用python写出并加以详细解释
前言
要先导入numpy库哦
import numpy as np
写在前面:python和MATLAB在矩阵和向量方面最大的不同是,python中无论行向量和列向量都用数组表示,例如[1,2,3]既可以表示横着的行向量,也可以表示竖着的列向量。
下面是个栗子:
import numpy as np
# 定义矩阵 A 和 B
A = np.array([[1, 2],
[3, 4]])
B = np.array([1, 8])
# 矩阵乘法
result_matrix = np.dot(A, B)
print("矩阵乘法 A * B:\n", result_matrix)
结果:[17,35]
一、sum函数
# 创建一个矩阵
matrix = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
# 按列求和
column_sum = np.sum(matrix, axis=0)
print("按列求和结果:", column_sum)
#按列求和结果: [12 15 18]
# 按行求和
row_sum = np.sum(matrix, axis=1)
print("按行求和结果:", row_sum)
#按行求和结果: [ 6 15 24]
# 对整个矩阵求和
total_sum = np.sum(matrix)
print("整个矩阵求和结果:", total_sum)
#整个矩阵求和结果:45
二、如何提取矩阵中指定位置的元素
Python中矩阵从第0行第0列开始
# 创建一个矩阵
matrix = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
[10, 11, 12],
[13, 14, 15]])
# (1)取指定行和列的一个元素(输出的是一个值)
element = matrix[1, 2]
print("指定行和列的元素:", element) # 输出:6
# (2)取指定的某一行的全部元素
row = matrix[2, :]
print("指定行的全部元素:", row) # 输出:[7 8 9]
# (3)取指定的某一列的全部元素
column = matrix[:, 1]
print("指定列的全部元素:", column) # 输出:[ 2 5 8 11 14]
# (4)取指定的某些行的全部元素(输出的是一个矩阵)
selected_rows = matrix[[1, 4], :]
print("取指定的某些行的全部元素:", selected_rows)
#[[ 4 5 6]
#[13 14 15]]
# 只取第二行和第五行(一共2行)
rows_2_and_5 = matrix[[1, 4], :]
print("只取第二行和第五行:", rows_2_and_5)
# [[ 4 5 6]
# [13 14 15]]
# 取第二行到第五行(一共4行)
#python是前取后不取!!!!!!!!!!!!!!!!!!!!!!!!!!!!
rows_2_to_5 = matrix[1:5, :]
print("取第二行到第五行:", rows_2_to_5)
# [[ 4 5 6]
# [ 7 8 9]
# [10 11 12]
# [13 14 15]]
# 取第二行到最后一行
rows_2_to_end = matrix[1:, :]
print("取第二行到最后一行:", rows_2_to_end)
# 取第二行到倒数第二行
rows_2_to_minus_2 = matrix[1:-1, :]
print("取第二行到倒数第二行:", rows_2_to_minus_2)
# (5)取全部元素(按列拼接的)
all_elements = matrix.ravel()
print("全部元素(按列拼接):", all_elements)
三、size函数
# 创建矩阵 A 和 B
A = np.array([[1, 2, 3],
[4, 5, 6]])
B = np.array([1, 2, 3, 4, 5, 6])
# 使用 shape 属性获取矩阵 A 和 B 的大小(行数和列数)
#返回的是数组
size_A = A.shape
size_B = B.shape
# 打印矩阵 A 和 B 的大小
print("矩阵 A 的大小:", size_A) # 输出:(2, 3) 表示 2 行 3 列
print("矩阵 B 的大小:", size_B) # 输出:(6,) 表示 1 维数组,长度为 6
# 将矩阵 A 的行数和列数分别存储在 r 和 c 变量中
r, c = size_A
# 打印行数和列数
print("矩阵 A 的行数:", r) # 输出:2
print("矩阵 A 的列数:", c) # 输出:3
# 通过 shape 属性的索引获取行数和列数
r = A.shape[0]
c = A.shape[1]
# 打印行数和列数
print("矩阵 A 的行数:", r) # 输出:2
print("矩阵 A 的列数:", c) # 输出:3
四、title函数(使用 tile 函数来实现 repmat 功能)
# 创建矩阵 A
A = np.array([[1, 2, 3],
[4, 5, 6]])
# 使用 tile 函数来实现 repmat 功能
# B = np.tile(A, (m, n))
B1 = np.tile(A, (2, 1))
B2 = np.tile(A, (3, 2))
# 打印结果
print("重复2行1列的矩阵 B1:\n", B1)
print("重复3行2列的矩阵 B2:\n", B2)
五、矩阵的运算
注意:在使用np.linalg时,矩阵必须是二维的,不能是列向量或者行向量。
# 定义矩阵 A 和 B
A = np.array([[1, 2],
[3, 4]])
B = np.array([[1, 8],
[1, 1]])
# 矩阵乘法
result_matrix = np.dot(A, B)
print("矩阵乘法 A * B:\n", result_matrix)
# 求矩阵 B 的逆矩阵
inverse_B = np.linalg.inv(B)
print("矩阵 B 的逆矩阵:\n", inverse_B)
# B 与其逆矩阵相乘(应该接近单位矩阵)
B_times_inverse_B = np.dot(B, inverse_B)
print("B 与其逆矩阵相乘:\n", B_times_inverse_B)
# A 与矩阵 B 的逆矩阵相乘
A_times_inverse_B = np.dot(A, inverse_B)
print("A 与矩阵 B 的逆矩阵相乘:\n", A_times_inverse_B)
# 矩阵除法(A / B = A * B^-1)
division_result = np.dot(A, np.linalg.inv(B))
print("矩阵除法 A / B:\n", division_result)
# 两个形状相同的矩阵对应元素之间的乘法和除法
elementwise_mult = np.multiply(A, B)
elementwise_div = np.divide(A, B)
print("对应元素之间的乘法 A .* B:\n", elementwise_mult)
print("对应元素之间的除法 A ./ B:\n", elementwise_div)
# 每个元素同时和常数相乘或相除操作
scalar_mult = np.multiply(A, 2)
scalar_div = np.divide(A, 2)
print("每个元素与常数相乘 A * 2:\n", scalar_mult)
print("每个元素与常数相除 A / 2:\n", scalar_div)
# 每个元素同时乘方(平方)
elementwise_power = np.power(A, 2)
print("每个元素同时乘方 A .^ 2:\n", elementwise_power)
六、特征值和特征向量
# 使用 np.linalg.eig() 函数计算矩阵 A 的特征值和特征向量
# 返回值 eigvals 是特征值数组,eigvecs 是特征向量矩阵(每列是一个特征向量)
# 定义矩阵 A
A = np.array([[1, 2, 3],
[2, 2, 1],
[2, 0, 3]])
# 使用 np.linalg.eig() 函数计算矩阵 A 的特征值和特征向量
# 返回值 eigvals 是特征值数组,eigvecs 是特征向量矩阵(每列是一个特征向量)
eigvals, eigvecs = np.linalg.eig(A)
# 打印全部特征值和特征向量
print("全部特征值:\n", eigvals)
print("全部特征向量:\n", eigvecs)
# 如果你同时想获取特征向量和特征值,可以这样获取
V = eigvecs
D = np.diag(eigvals)
print("特征向量矩阵 V:\n", V)
print("对角阵 D:\n", D)
七、获取矩阵非零元素的位置 矩阵与常数的大小判断运算
# 定义矩阵 X
X = np.array([[1, -3, 0],
[0, 0, 8],
[4, 0, 6]])
# 使用 np.nonzero() 函数获取矩阵中非零元素的位置索引
ind_matrix = np.nonzero(X)
print("非零元素的位置索引(矩阵):\n", ind_matrix)
# 使用 np.argwhere() 函数获取矩阵中非零元素的位置索引(更直观)
ind_matrix_argwhere = np.argwhere(X)
print("非零元素的位置索引(矩阵)(使用 np.argwhere()):\n", ind_matrix_argwhere)
# 找到第一个非零元素的位置索引
first_nonzero = np.argwhere(X)[0]
print("第一个非零元素的位置索引:\n", first_nonzero)
#矩阵与常数的大小判断运算
# 定义矩阵 X
X = np.array([[1, -3, 0],
[0, 0, 8],
[4, 0, 6]])
# 大于 > 运算
greater_than_zero = X > 0
print("大于 0 的元素:\n", greater_than_zero)
# 等于 == 运算
equal_to_four = X == 4
print("等于 4 的元素:\n", equal_to_four)
总结
以上就是今天要讲的内容,本文仅仅简单介绍了python矩阵的基础应用,后续内容正在加紧创作。