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的字典和列表的使用中一些需要注意的地方
Apr 24 Python
Django imgareaselect手动剪切头像实现方法
May 26 Python
python下MySQLdb用法实例分析
Jun 08 Python
最大K个数问题的Python版解法总结
Jun 16 Python
Python3使用正则表达式爬取内涵段子示例
Apr 22 Python
python 实现将txt文件多行合并为一行并将中间的空格去掉方法
Dec 20 Python
Python小进度条显示代码
Mar 05 Python
Python小程序 控制鼠标循环点击代码实例
Oct 08 Python
Python实现多线程下载脚本的示例代码
Apr 03 Python
python各种excel写入方式的速度对比
Nov 10 Python
如何将Pycharm中调整字体大小的方式设置为"ctrl+鼠标滚轮上下滑"
Nov 17 Python
浅析python中特殊文件和特殊函数
Feb 24 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
PHP语言中global和$GLOBALS[]的分析 之二
2012/02/02 PHP
用 Composer构建自己的 PHP 框架之基础准备
2014/10/30 PHP
php之static静态属性与静态方法实例分析
2015/07/30 PHP
php使用pdo连接sqlite3的配置示例
2016/05/27 PHP
微信开发之php表单微信中自动提交两次问题解决办法
2017/01/08 PHP
使用PHP连接数据库_实现用户数据的增删改查的整体操作示例
2017/09/01 PHP
Laravel源码解析之路由的使用和示例详解
2018/09/27 PHP
laravel利用中间件做防非法登录和权限控制示例
2019/10/21 PHP
使用jQuery向asp.net Mvc传递复杂json数据-ModelBinder篇
2010/05/07 Javascript
JS日期和时间选择控件升级版(自写)
2013/08/02 Javascript
jquery 表格排序、实时搜索表格内容(附图)
2014/05/19 Javascript
在NodeJS中启用ECMAScript 6小结(windos以及Linux)
2014/07/15 NodeJs
JS 对象(Object)和字符串(String)互转方法
2016/05/20 Javascript
关于JavaScript限制字数的输入框的那些事
2016/08/14 Javascript
Vue.js手风琴菜单组件开发实例
2017/05/16 Javascript
Angular2 组件通信的实例代码
2017/06/23 Javascript
react实现菜单权限控制的方法
2017/12/11 Javascript
详解vue中的computed的this指向问题
2018/12/05 Javascript
Vue插槽_特殊特性slot,slot-scope与指令v-slot说明
2020/09/04 Javascript
[03:18]DOTA2放量测试专访820:希望玩家加入国服大家庭
2013/08/25 DOTA
用Python进行基础的函数式编程的教程
2015/03/31 Python
简单介绍Python下自己编写web框架的一些要点
2015/04/29 Python
python实现给微信公众号发送消息的方法
2017/06/30 Python
Python中使用支持向量机(SVM)算法
2017/12/26 Python
Python3实现的爬虫爬取数据并存入mysql数据库操作示例
2018/06/06 Python
python实现屏保计时器的示例代码
2018/08/08 Python
详解Python数据可视化编程 - 词云生成并保存(jieba+WordCloud)
2019/03/26 Python
Python shelve模块实现解析
2019/08/28 Python
Python sklearn中的.fit与.predict的用法说明
2020/06/28 Python
python 两种方法删除空文件夹
2020/09/29 Python
酒店管理专业毕业生自我鉴定
2014/09/29 职场文书
师范生免费教育协议书范本
2014/10/09 职场文书
迟到检讨书范文
2015/01/27 职场文书
求职信范文怎么写
2015/03/19 职场文书
未中标通知书
2015/04/17 职场文书
学习习近平主席讲话心得体会
2016/01/20 职场文书