Numpy中对向量、矩阵的使用详解


Posted in Python onOctober 29, 2019

在下面的代码里面,我们利用numpy和scipy做了很多工作,每一行都有注释,讲解了对应的向量/矩阵操作。

归纳一下,下面的代码主要做了这些事:

  • 创建一个向量
  • 创建一个矩阵
  • 创建一个稀疏矩阵
  • 选择元素
  • 展示一个矩阵的属性
  • 对多个元素同时应用某种操作
  • 找到最大值和最小值
  • 计算平均值、方差和标准差
  • 矩阵变形
  • 转置向量或矩阵
  • 展开一个矩阵
  • 计算矩阵的秩
  • 计算行列式
  • 获取矩阵的对角线元素
  • 计算矩阵的迹
  • 计算特征值和特征向量
  • 计算点积
  • 矩阵的相加相减
  • 矩阵的乘法
  • 计算矩阵的逆

一起来看代码吧:

# 加载numpy库
import numpy as np

from scipy import sparse

# 创建一个一维数组表示一个行向量
vector_row = np.array([1, 2, 3])

# 创建一个一维数组表示一个列向量
vector_column = np.array([[1], [2], [3]])

# 创建一个二维数组表示一个矩阵
matrix1 = np.array([[1, 2], [1, 2], [1, 2]])

# 利用Numpy内置矩阵数据结构
matrix1_object = np.mat([[1, 2], [1, 2], [1, 2]])

# 创建一个新的矩阵
matrix2 = np.array([[0, 0], [0, 1], [3, 0]])

# 创建一个压缩的稀疏行(CSR)矩阵
matrix2_sparse = sparse.csc_matrix(matrix2)

# 查看稀疏矩阵
print(matrix2_sparse)

# 创建一个更大的矩阵
matrix_large = np.array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
             [0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
             [3, 0, 0, 0, 0, 0, 0, 0, 0, 0]])

# 创建一个CSR矩阵
matrix_large_sparse = sparse.csr_matrix(matrix_large)

# 查看更大的稀疏矩阵
print(matrix_large_sparse)

# 创建一个行向量
vector = np.array([1, 2, 3, 4, 5, 6])

# 创建矩阵
matrix_vector = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

# 选择向量的第三个元素
print(vector[2])

# 选择第二行第二列
print(matrix_vector[1, 1])

# 选取一个向量的所有元素
print(vector[:])

# 选取从0开始一直到第3个(包含第3个)元素
print(vector[:3])

# 选取第3个元素之后的全部元素
print(vector[3:])

# 选取最后一个元素
print(vector[-1])

# 选取矩阵的第1行和第2行以及所有列
print(matrix_vector[:2, :])

# 选取所有行以及第2列
print(matrix_vector[:, 1:2])

# 选取所有行以及第2列并转换成一个新的行向量
print(matrix_vector[:, 1])

# 创建新的矩阵
matrix3 = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])

# 查看行数和列数
print(matrix3.shape)

# 查看元素数量
print(matrix3.size)

# 查看维数
print(matrix3.ndim)

# 下面使用的矩阵是matrix_vector
# 创建一个匿名函数,返回输入值加上100以后的值
add_100 = lambda i: i+100

# 创建向量转化函数
vectorized_add_100 = np.vectorize(add_100)

# 对矩阵的所有元素应用这个函数
print(vectorized_add_100(matrix_vector))

# 用后矩阵本身不变
print(matrix_vector)

# 连续使用
print(vectorized_add_100(vectorized_add_100(matrix_vector)))

# 返回最大的元素
print(np.max(matrix_vector))

# 返回最小元素
print(np.min(matrix_vector))

# 找到每一列的最大元素
print(np.max(matrix_vector, axis=0))

# 找到每一行最大的元素
print(np.max(matrix_vector, axis=1))

# 返回平均值
print(np.mean(matrix_vector))

# 返回方差
print(np.var(matrix_vector))

# 返回标准差
print(np.std(matrix_vector))

# 求每一列的平均值
print(np.mean(matrix_vector, axis=0))

# 求每一行的方差
print(np.var(matrix_vector, axis=1))

# 将matrix3矩阵变为2×6矩阵
matrix4 = matrix3.reshape(2, 6)
print(matrix4)

# 上面的变形要求前后元素个数相同,且不会改变元素个数
print(matrix4.size)

# reshape时传入参数-1意味着可以根据需要填充元素
print(matrix3.reshape(1, -1))

# reshape如果提供一个整数,那么reshape会返回一个长度为该整数值的一维数组
print(matrix3.reshape(12))

# 转置matrix_vector矩阵
print(matrix_vector.T)

# 严格地讲,向量是不能被转置的
print(vector.T)

# 转置向量通常指二维数组表示形式下将行向量转换为列向量或者反向转换
print(np.array([[1, 2, 3, 4, 5, 6]]).T)

# 将matrix_vector矩阵展开
print(matrix_vector.flatten())

# 将矩阵展开的另一种策略是利用reshape创建一个行向量
print(matrix_vector.reshape(1, -1))

# 创建用于求秩的新矩阵
matrix5 = np.array([[1, 1, 1], [1, 1, 10], [1, 1, 15]])

# 计算矩阵matrix5的秩
print(np.linalg.matrix_rank(matrix5))

# 创建用于行列式求解的新矩阵
matrix6 = np.array([[1, 2, 3], [2, 4, 6], [3, 8, 9]])

# 求解矩阵matrix6的行列式
print(np.linalg.det(matrix6))

# 返回矩阵的对角线元素
print(matrix6.diagonal())

# 返回主对角线向上偏移量为1的对角线元素
print(matrix6.diagonal(offset=1))

# 返回主对角线向下偏移量为1的对角线元素
print(matrix6.diagonal(offset=-1))

# 返回矩阵的迹
print(matrix6.trace())

# 求迹的另外的方法(返回对角线元素并求和)
print(sum(matrix6.diagonal()))

# 创建一个求解特征值、特征向量的矩阵
matrix7 = np.array([[1, -1, 3], [1, 1, 6], [3, 8, 9]])

# 计算特征值和特征向量
eigenvalues, eigenvectors = np.linalg.eig(matrix7)

# 查看特征值
print(eigenvalues)

# 查看特征向量
print(eigenvectors)

# 构造两个点积(数量积)所需向量
vector_a = np.array([1, 2, 3])
vector_b = np.array([4, 5, 6])

# 计算点积
print(np.dot(vector_a, vector_b))

# Python 3.5+ 版本可以这样求解点积
print(vector_a @ vector_b)

# 构造两个可用于加减的矩阵
matrix_a = np.array([[1, 1, 1], [1, 1, 1], [1, 1, 2]])
matrix_b = np.array([[1, 3, 1], [1, 3, 1], [1, 3, 8]])

# 两矩阵相加
print(np.add(matrix_a, matrix_b))

# 两矩阵相减
print(np.subtract(matrix_a, matrix_b))

# 直接用+/-也可以做矩阵加减
print(matrix_a + matrix_b)
print(matrix_a - matrix_b)

# 构造两个可用于乘法的小矩阵
matrix_c = np.array([[1, 1], [1, 2]])
matrix_d = np.array([[1, 3], [1, 2]])

# 两矩阵相乘
print(np.dot(matrix_c, matrix_d))

# Python 3.5+ 版本可以这样求解矩阵乘法
print(matrix_c @ matrix_d)

# 我们也可以把两矩阵对应元素相乘,而非矩阵乘法
print(matrix_c * matrix_d)

# 创建一个用于求逆的矩阵
matrix8 = np.array([[1, 4], [2, 5]])

# 计算矩阵的逆
print(np.linalg.inv(matrix8))

# 验证一个矩阵和它的逆矩阵相乘等于I(单位矩阵)
print(matrix8 @ np.linalg.inv(matrix8))

测试结果:

  (2, 0) 3
  (1, 1) 1
  (1, 1) 1
  (2, 0) 3
3
5
[1 2 3 4 5 6]
[1 2 3]
[4 5 6]
6
[[1 2 3]
 [4 5 6]]
[[2]
 [5]
 [8]]
[2 5 8]
(3, 4)
12
2
[[101 102 103]
 [104 105 106]
 [107 108 109]]
[[1 2 3]
 [4 5 6]
 [7 8 9]]
[[201 202 203]
 [204 205 206]
 [207 208 209]]
9
1
[7 8 9]
[3 6 9]
5.0
6.666666666666667
2.581988897471611
[4. 5. 6.]
[0.66666667 0.66666667 0.66666667]
[[ 1  2  3  4  5  6]
 [ 7  8  9 10 11 12]]
12
[[ 1  2  3  4  5  6  7  8  9 10 11 12]]
[ 1  2  3  4  5  6  7  8  9 10 11 12]
[[1 4 7]
 [2 5 8]
 [3 6 9]]
[1 2 3 4 5 6]
[[1]
 [2]
 [3]
 [4]
 [5]
 [6]]
[1 2 3 4 5 6 7 8 9]
[[1 2 3 4 5 6 7 8 9]]
2
0.0
[1 4 9]
[2 6]
[2 8]
14
14
[13.55075847  0.74003145 -3.29078992]
[[-0.17622017 -0.96677403 -0.53373322]
 [-0.435951    0.2053623  -0.64324848]
 [-0.88254925  0.15223105  0.54896288]]
32
32
[[ 2  4  2]
 [ 2  4  2]
 [ 2  4 10]]
[[ 0 -2  0]
 [ 0 -2  0]
 [ 0 -2 -6]]
[[ 2  4  2]
 [ 2  4  2]
 [ 2  4 10]]
[[ 0 -2  0]
 [ 0 -2  0]
 [ 0 -2 -6]]
[[2 5]
 [3 7]]
[[2 5]
 [3 7]]
[[1 3]
 [1 4]]
[[-1.66666667  1.33333333]
 [ 0.66666667 -0.33333333]]
[[1.00000000e+00 0.00000000e+00]
 [1.11022302e-16 1.00000000e+00]]

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python使用Turtle模块绘制五星红旗代码示例
Dec 11 Python
python实现俄罗斯方块游戏
Mar 25 Python
解决pandas.DataFrame.fillna 填充Nan失败的问题
Nov 06 Python
python 实现倒排索引的方法
Dec 25 Python
django 连接数据库 sqlite的例子
Aug 14 Python
Ranorex通过Python将报告发送到邮箱的方法
Jan 12 Python
Numpy 理解ndarray对象的示例代码
Apr 03 Python
Python如何实现邮件功能
May 27 Python
Python内置异常类型全面汇总
May 28 Python
详解python with 上下文管理器
Sep 02 Python
基于python的opencv图像处理实现对斑马线的检测示例
Nov 29 Python
Python爬虫定时计划任务的几种常见方法(推荐)
Jan 15 Python
pygame实现俄罗斯方块游戏(AI篇2)
Oct 29 #Python
pygame实现俄罗斯方块游戏(AI篇1)
Oct 29 #Python
基于Django统计博客文章阅读量
Oct 29 #Python
pygame实现俄罗斯方块游戏(基础篇3)
Oct 29 #Python
python安装gdal的两种方法
Oct 29 #Python
pygame实现俄罗斯方块游戏(基础篇2)
Oct 29 #Python
pygame实现俄罗斯方块游戏(基础篇1)
Oct 29 #Python
You might like
Smarty模板快速入门
2007/01/04 PHP
PHP写MySQL数据 实现代码
2009/06/15 PHP
递归删除一个节点以及该节点下的所有节点示例
2014/03/19 PHP
php准确计算复活节日期的方法
2015/04/18 PHP
PHP实现的日历功能示例
2018/09/01 PHP
PHP实现获取毫秒时间戳的方法【使用microtime()函数】
2019/03/01 PHP
如何确保JavaScript的执行顺序 之实战篇
2011/03/03 Javascript
JavaScript中变量提升 Hoisting
2012/07/03 Javascript
JQuery设置文本框和密码框得到焦点时的样式
2013/08/30 Javascript
JQueryiframe页面操作父页面中的元素与方法(实例讲解)
2013/11/19 Javascript
Extjs 4.x 得到form CheckBox 复选框的值
2014/05/04 Javascript
Node.js 制作实时多人游戏框架
2015/01/08 Javascript
Bootstrap Metronic完全响应式管理模板之菜单栏学习笔记
2016/07/08 Javascript
Angular开发者指南之入门介绍
2017/03/05 Javascript
JS简单添加元素新节点的方法示例
2018/02/10 Javascript
Vue项目中添加锁屏功能实现思路
2018/06/29 Javascript
nodejs实现一个word文档解析器思路详解
2018/08/14 NodeJs
JavaScript实现多文件下载方法解析
2020/08/07 Javascript
详解vite2.0配置学习(typescript版本)
2021/02/25 Javascript
基于hashlib模块--加密(详解)
2017/06/21 Python
Python决策树分类算法学习
2017/12/22 Python
Python爬虫实战之12306抢票开源
2019/01/24 Python
Python 函数返回值的示例代码
2019/03/11 Python
对PyQt5的输入对话框使用(QInputDialog)详解
2019/06/25 Python
python程序中的线程操作 concurrent模块使用详解
2019/09/23 Python
Django 自定义分页器的实现代码
2019/11/24 Python
在python中使用nohup命令说明
2020/04/16 Python
Python远程方法调用实现过程解析
2020/07/28 Python
Python自动化办公Excel模块openpyxl原理及用法解析
2020/11/05 Python
医学生实习自我鉴定
2013/09/27 职场文书
关于毕业的广播稿
2014/01/10 职场文书
借钱欠条怎么写
2015/07/03 职场文书
学生病假条怎么写
2015/08/17 职场文书
2016清明节森林防火广播稿
2015/12/17 职场文书
导游词之桂林
2019/08/20 职场文书
python语言中pandas字符串分割str.split()函数
2022/08/05 Python