python+numpy实现的基本矩阵操作示例


Posted in Python onJuly 19, 2019

本文实例讲述了python+numpy实现的基本矩阵操作。分享给大家供大家参考,具体如下:

#! usr/bin/env python
# coding: utf-8
# 学习numpy中矩阵的代码笔记
# 2018年05月29日15:43:40
# 参考网站:http://cs231n.github.io/python-numpy-tutorial/
import numpy as np
#==================矩阵的创建,增删查改,索引,运算=================================#
#==================矩阵的创建,增删查改=================================#
# # 创建行向量
# x = np.array([1,2,3])
# # 修改某个值
# x[0] = 0
# 注意下标索引从0开始,与MATLAB不一样
# print(x)
# print(x.shape)
# print(type(x))
#
# # 创建二维与多维矩阵
# matrix = np.array([[1,2,3],[1,2,3],[2,3,4]]) # 注意这里有一个小括号,小括号中还有一个中括号
# # 取出某个元素
# a1 = matrix[0][0]
# print(a1)
# print(matrix.shape)
#
# # # 创建特殊矩阵
# # 0矩阵
# zeros = np.zeros((2,2))# 注意,这里有两个小括号,并且返回浮点型数据,而不是整形
# print(zeros)
#
# # 创建1矩阵
# ones = np.ones([3,3])# 注意这里也是两个括号,其中里面的小括号也可是中括号,但是不建议使用
# print(ones)
#
# # 创建元素相同()的矩阵
# full = np.full((2,3),2) #其中第一个括号表示矩阵大小,后面的数字表示填充的数字
# print(full)
#
# # 创建对角数为1的矩阵
# diag = np.eye(3,3)#注意这里如果行列数不同,只会让行列下标相等的元素为1
# print(diag)
#
# # 创建随机矩阵(值在0到1之间),注意这个方式不可以重复,也就是随机不可以全部重现,每次运行都会不一样
# random = np.random.random((2,3))
# 写到这里,我需要说明一点,就是如何确定括号的个数
# numpy下的方法肯定是有一个小括号的,且不可以改变
# 想要表达多维阵列,则需要输入一个元祖(小括号)或者列表(中括号)来创建,这时就需要小括号或者中括号
# 如果是自己手敲出多维阵列,每一行需要中括号表示,用逗号分离每一行,然后外层再用一个中括号表示整个矩阵,然后再作为一个举证输入函数中
# print(random)
#=======================矩阵的索引,切片=========================#
metaMatrix = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])#用逗号,而不能用空格
# # 单个元素的索引
# a = metaMatrix[0][0]
# b = metaMatrix[0,0] # 这里不能使用小括号
# print(a)
# print(b)
#
# # 切片操作
# a_ = metaMatrix[0:2,1]# 注意这里冒号后面的数是不索引的,如果缺省就是到最后,冒号前是可以得到的
# # 冒号后的数不索引,这时python的特点,与MATLAB不一样
# print(a_)
#
# # 注意切片操作后矩阵维度的变化
# a1 = metaMatrix[0:1,:]
# a2 = metaMatrix[0,:]
# b = metaMatrix[0,1]
# print(a1)
# print(a2)
# print(b)
# # 注意到这两行代码得到的数据是一样的,但是维度已经发生了变化
# print(a1.shape) #a1仍然是矩阵
# print(a2.shape) #a2则是一个行向量,相比原矩阵,这里就少了一个维度,这与MATLAB有点不同
# print(b.shape) #b是没有维度的,就是一个数而已
#
# # 利用已有矩阵创建新矩阵,方法比较多样化
# SrcMatrix = np.array([[1,2], [3, 4], [5, 6]])
# print(SrcMatrix)
# # 利用矩阵的方式索引原有矩阵
# matrix1 = SrcMatrix[[0,1],[1,1]]# 这时将两个中括号的对应元素组合起来进行索引,是单个元素索引的扩展
# # 进行单个元素索引,然后组合起来,并用np.array创建成np的数组
# matrix2 = np.array([SrcMatrix[0][1],SrcMatrix[1][1]])
# # 如果不用np.array来创建成np的矩阵,就会导致数据格式的变化,对应的操作就会发生变化
# matrix3 = [SrcMatrix[0][1],SrcMatrix[1][1]]
# print(matrix1)
# print(matrix2)
# print(matrix3)
# print(type(matrix1))
# print(type(matrix2))
# print(type(matrix3))
#
# # numpy矩阵的元素索引方式可以用于改变或者选择矩阵不同行的元素(不仅仅是同一列的数据)
# a = np.array([[1,2,3], [4,5,6], [7,8,9], [10, 11, 12]])
# b = np.array([0,2,0,1])
# # 先介绍一下np.arrange()函数,表示创建一个从起始值到结束值少1(前面提到过,python中经常不到这个值)的行向量,也可以设定步长
# c = a[np.arange(4),b] #其实就是相当于矩阵方式索引一个矩阵中的元素(这比MATLAB中更加自由一些)
# print(c)
# # 改变矩阵的指定元素
# a[np.arange(4),b] += 10
# print(a)
#
# # 布尔型阵列,可以用来索引一些满足特定条件的元素
# matrix = np.array([[1,2],[3,4],[5,6]])
# bool_id = matrix>2 # 也可以写成bool_id =(matrix>2),注意,写成中括号就是不同含义了
# print(bool_id)
# print(matrix[bool_id])
# # 可以将上面两行代码合成一行
# matrix_ = matrix[matrix>2]# 注意,这里得到的是一维向量
# print(matrix_)
#
#=========================numpy array的数据类型=======================================#
# # numpy的array的数据类型是自动识别的,但也可以指定
# # 如果输入为整形,则会给数据的类型定义为int64
# matrix1 = np.array([1,2,3])
# print(matrix1.dtype)
# # 如果输入的数据为小数点,则会给数据类型定义为float64
# matrix2 = np.array([1.0,2.0,3.0])
# print(matrix2.dtype)
# # 如果有浮点型也有整形数据,会赋值给占字节数多的数据类型,且对应为64的
# matrix3 = np.array([1,2.0])
# print(matrix3.dtype)
# # 也可以指定数据类型
# matrix4 = np.array([1,2],dtype=np.int8)
# print(matrix4.dtype)
# # 当数据本身和指定的数据类型不符合时,会将数据转化成指定的数据类型,有可能会发生溢出
# matrix5 = np.array([1,2000000,3.1],dtype=np.int8)
# print(matrix5)
# print(matrix5.dtype)
#=========================矩阵的运算===================================#
#
# # 两种加法和减法,乘除
# x = np.array([[1,2],[3,4]])
# y = np.array([[5,6],[7,8]])
# sum1 = x + y# 直接使用加法
# sum2 = np.add(x,y)# 运用numpy的函数
# print(sum1)
# print(sum2)
#
# substract1 = x - y
# substract2 = np.subtract(x,y)
# print(substract1)
# print(substract2)
#
# prodution1 = x * y# 这是对应元素的乘法
# prodution2 = np.multiply(x,y)
# print(prodution1)
# print(prodution2)
#
# devide1 = x/y
# devide2 = np.divide(x,y)
# # 注意矩阵进行运算时,数据类型不改变,因此,需要注意溢出现象等
# print(devide1)
# print(devide2)
#
# # 矩阵的两种向量乘法(使用dot)
# x = np.array([[1,2],[3,4]])
# y = np.array([[5,6],[7,8]])
# multiDot1 = x.dot(y)
# multiDot2 = np.dot(x,y)
# print(multiDot1)
# print(multiDot2)
#
# # 矩阵运算基本函数
# x = np.array([[1,2],[3,4]])
# # 求和函数
# # 对所有元素求和
# sum_all = np.sum(x)
# # 对列求和
# sum_column = np.sum(x, 0)# 注意和MATLAB中的区分一下。
# # 对行求和
# sum_row = np.sum(x, 1)
# print(sum_all)
# print(sum_column)
# print(sum_row)
#
# # 矩阵的转置
# x = np.array([[1,2],[3,4]])
# transform = x.T
# print(transform)
#
# # broadcasting的应用,可以进行不同维度的矩阵算数运算
# # 考虑将一个常量行向量加到一个矩阵的每一行上
# # 下面会将x行向量加到y矩阵的每一行上(但是这个方法由于有显示循环,而显示循环比较慢一些,我们经常会采用其他方法)
# y = np.array([[1,2,3], [4,5,6], [7,8,9], [10, 11, 12]])
# x = np.array([1, 0, 1])
# y_ = np.empty_like(y) # 创建一个和y相同维度的矩阵,但没有放内容,但是已经开辟了一块内存,其中的数据可能随机
# print(y_)
# for i in range(4):
#  y_[i,:] = y[i,:] + x
# print(y_)
# # 另一种方法是我们先将x复制3份,垂直放置,组成一个矩阵,再进行矩阵加法
# x_ = np.tile(x,(4,1))# np.tile表示复制,(4,1)表示将x作为元素,组成4*1的矩阵形式
# y__ = np.add(y,x_)
# print(y__)
# # 实际上,如果不对x进行处理,而直接将两者相加,如果x和y满足一些条件,x会自动复制
# # 条件是x和y在一个维度上相等,另一个维度上不一样并且可以通过复制可以实现维度相等,则会自动复制
# print(y+x)
# # 这里进行一个其他的测试
# print(x.T+y.T)# 可以看出可以实现列的复制
# 这里进行都不为向量的相加
# a1 = np.array([[1,2],[3,4],[5,6],[7,8]])
# a2 = np.array([[1,0],[0,1]])
# print(a1+a2)# 这里会出错,说明只能自动进行一维数据的复制,多维数据不支持自动复制,而需要显式复制
# # 同样的,加法,减法和除法也都适合上面的自动复制原理
# 将一个矩阵或者向量进行维度的调整
x1 = np.array([1,2,3])
y1 = np.array([1,2])
# 实现x1和y1转置的矩阵乘法,可以先将y1变成列向量
print(np.multiply(x1, np.reshape(y1,(2,1))))
# 试一下其他的维度变化
x2 = np.array([[1,2],[3,4],[5,6],[7,8]])
print(np.reshape(x2, (2,4)))
print(np.reshape(x2, (4,2)))# 基本上按照西安航后列的顺序进行

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python里隐藏的“禅”
Jun 16 Python
Python实现的百度站长自动URL提交小工具
Jun 27 Python
Python3.x版本中新的字符串格式化方法
Apr 24 Python
Python编程之Re模块下的函数介绍
Oct 28 Python
Python如何获得百度统计API的数据并发送邮件示例代码
Jan 27 Python
解决django服务器重启端口被占用的问题
Jul 26 Python
Python适配器模式代码实现解析
Aug 02 Python
Python Django中间件使用原理及流程分析
Jun 13 Python
了解一下python内建模块collections
Sep 07 Python
安装python依赖包psycopg2来调用postgresql的操作
Jan 01 Python
如何用Python编写一个电子考勤系统
Feb 08 Python
anaconda python3.8安装后降级
Jun 11 Python
由面试题加深对Django的认识理解
Jul 19 #Python
基于Python函数和变量名解析
Jul 19 #Python
python关于矩阵重复赋值覆盖问题的解决方法
Jul 19 #Python
对Python生成器、装饰器、递归的使用详解
Jul 19 #Python
django中SMTP发送邮件配置详解
Jul 19 #Python
对Python函数设计规范详解
Jul 19 #Python
在django view中给form传入参数的例子
Jul 19 #Python
You might like
ftp类(example.php)
2006/10/09 PHP
分页显示Oracle数据库记录的类之二
2006/10/09 PHP
根据中文裁减字符串函数的php代码
2013/12/03 PHP
PHP与MYSQL中UTF8编码的中文排序实例
2014/10/21 PHP
使用PHP进行微信公众平台开发的示例
2015/08/21 PHP
Linux下安装Memcached服务器和客户端与PHP使用示例
2019/04/15 PHP
laravel 验证错误信息到 blade模板的方法
2019/09/29 PHP
jQuery使用手册之二 DOM操作
2007/03/24 Javascript
javascript数字数组去重复项的实现代码
2010/12/30 Javascript
当jQuery遭遇CoffeeScript的时候 使用分享
2011/09/17 Javascript
Raphael一个用于在网页中绘制矢量图形的Javascript库
2013/01/08 Javascript
THREE.JS入门教程(3)着色器-下
2013/01/24 Javascript
js控制frameSet示例
2013/09/10 Javascript
超实用的javascript时间处理总结
2016/08/16 Javascript
浅析Javascript ES6新增值比较函数Object.is
2016/08/24 Javascript
基于Bootstrap的网页设计实例
2017/03/01 Javascript
VUE axios发送跨域请求需要注意的问题
2017/07/06 Javascript
echarts设置图例颜色和地图底色的方法实例
2018/08/01 Javascript
jQuery实现的简单日历组件定义与用法示例
2018/12/24 jQuery
vue elementUI table表格数据 滚动懒加载的实现方法
2019/04/04 Javascript
服务端预渲染之Nuxt(使用篇)
2019/04/08 Javascript
详解vue-cli中使用rem,vue自适应
2019/05/06 Javascript
js实现的格式化数字和金额功能简单示例
2019/07/30 Javascript
JS动态显示倒计时效果
2019/12/12 Javascript
详解vue中v-model和v-bind绑定数据的异同
2020/08/10 Javascript
在Python中操作时间之strptime()方法的使用
2020/12/30 Python
对python周期性定时器的示例详解
2019/02/19 Python
超简单使用Python换脸实例
2019/03/27 Python
Python opencv实现人眼/人脸识别以及实时打码处理
2019/04/29 Python
django表单的Widgets使用详解
2019/07/22 Python
用Python实现校园通知更新提醒功能
2019/11/23 Python
Tory Burch美国官方网站:美国时尚生活品牌
2016/08/01 全球购物
台湾母婴用品购物网站:Infant婴之房
2018/06/15 全球购物
c++工程师面试问题
2013/08/04 面试题
实习生自荐信范文
2013/11/13 职场文书
使用JS前端技术实现静态图片局部流动效果
2022/08/05 Javascript