python之数学建模与矩阵

提示:本文将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矩阵的基础应用,后续内容正在加紧创作。

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值