Python常用库Numpy进行矩阵运算详解


Posted in Python onJuly 21, 2020

Numpy支持大量的维度数组和矩阵运算,对数组运算提供了大量的数学函数库!

Numpy比Python列表更具优势,其中一个优势便是速度。在对大型数组执行操作时,Numpy的速度比Python列表的速度快了好几百。因为Numpy数组本身能节省内存,并且Numpy在执行算术、统计和线性代数运算时采用了优化算法。

Numpy的另一个强大功能是具有可以表示向量和矩阵的多维数组数据结构。Numpy对矩阵运算进行了优化,使我们能够高效地执行线性代数运算,使其非常适合解决机器学习问题。

与Python列表相比,Numpy具有的另一个强大优势是具有大量优化的内置数学函数。这些函数使你能够非常快速地进行各种复杂的数学计算,并且用到很少代码(无需使用复杂的循环),使程序更容易读懂和理解。

注:在ndarray结构中,里面元素必须是同一类型的,如果不是,会自动的向下进行。

Numpy简单创建数组

a = [1, 2, 3]
b = np.array(a)
c = np.array([[0, 1, 2, 10],
    [12, 13, 100, 101],
    [102, 110, 112, 113]], int)
print(c)
print(b)

创建数值为1的数组

Numpy.ones(参数 1:shape,数组的形状;参数 2:dtype, 数值类型)

array_one = np.ones([10, 10], dtype=np.int)
 print(array_one)

创建数值为0的数组

Numpy.zeros(参数 1:shape,数组的形状;参数 2:dtype, 数值类型)

array_zero = np.zeros([10, 9], dtype=np.float)
 print(array_zero)

创建指定数值的数组

Numpy.full(参数 1:shape,数组的形状; 参数 2:constant value,数组填充的常数值;参数 3:dtype, 数值类型)

array_full = np.full((2, 3), 5)
 print(array_full)

创建单位矩阵

Numpy.eye(参数 1:N,方阵的维度)

array_eye = np.eye(5)
 print(array_eye)

创建对角矩阵

Numpy.diag(参数1:v,主对角线数值,参数 2:k,对角线元素):K = 0表示主对角线,k>0的值选择在主对角线之上的对角线中的元素,k<0的值选择在主对角线之下的对角线中的元素

array_diag = np.diag([10, 20, 30, 40])
 print(array_diag)

Numpy查看数组属性

数组元素个数:b.size 或 np.size()

数组形状:b.shape 或 np.shape()

数组维度:b.ndim

数组元素类型:b.dtype

# 数组元素个数:3
print(b.size)
# 数组形状:(3,)
print(b.shape)
# 数组维度:1
print(b.ndim)
# 数组元素类型:int32
print(b.dtype)

矩阵第一维的长度:shape[0] # 行

矩阵第二维的长度:shape[1] # 列

.......

array_rand = np.random.rand(10, 10, 4)
 print(array_rand)
 print(array_rand.ndim)
 print(array_rand.shape[0])
 print(array_rand.shape[1])
 print(array_rand.shape[2])

Numpy创建随机数组(np.random)

均匀分布

创建指定形状的数组,数值范围在0~1之间

array_rand = np.random.rand(10, 10, 4)
 print(array_rand)
 print(array_rand.ndim)

创建指定范围内的一个数:Numpy.random.uniform(low, high, size=None)

array_uniform = np.random.uniform(0, 100, size=5)
print(array_uniform)

创建指定范围的一个整数:Numpy.random.randint(low, high, size=None)

array_int = np.random.randint(0, 100, size=3)
print(array_int)
print(array_int.size)

Numpy.arange()和Numpy.linspace()函数也可以均匀分布

Numpy.arange(start, stop, step):创建一个秩为1的array,其中包含位于半开区间[start, stop)内并均匀分布的值,step表示两个相邻值之间的差。

Numpy.linspace(start, stop, N):创建N个在闭区间[start, stop]内均匀分布的值。

X = np.arange(1, 5, 2, dtype=np.int)
 print(X)
 y = np.linspace(1, 5, 3)
 print(y)

正态分布

创建给定均值、标准差、维度的正态分布:Numpy.random.normal(loc, scale, size)

# 正态生成4行5列的二位数组
 array_normal = np.random.normal(loc=1.75, scale=0.1, size=[4, 5])
 print(array_normal)
 print(array_normal.ndim)

Numpy数组操作

数组的索引

array[start : end]

array[start:]

array[:end]

布尔型索引:array[array>10 & array<20]

# 截取第0至第3行,第2至第4列(从第0行第0列算起)
 after_array = array_normal[:3, 2:4]
 print(after_array)

数组的复制

Numpy.copy(参数 1:数组):创建给定array的一个副本,还可当做方法用。

after_array = array_normal[:3, 2:4].copy()
copy_array = np.copy(array_normal[:, 2:4])

Numpy.sort(参数 1:a,数组;参数 2:axis=0/1,0表示行1表示列):np.sort()作为函数使用时,不更改被排序的原始array;array.sort()作为方法使用时,会对原始array修改为排序后数组array

# 整体排序
 np.sort(array_normal)
 # 仅行排序
 np.sort(array_normal, axis=0)
 # 仅列排序
 np.sort(array_normal, axis=1)

数组唯一元素

Numpy.unique(参数 1:a,数组;参数 2:return_index=True/False,新列表元素在旧列表中的位置;参数 3:return_inverse=True/False,旧列表元素在新列表中的位置;参数 4:return_counts,元素的数量;参数 5:axis=0/1,0表示行1表示列):查找array中的唯一元素。

print("提取唯一元素", np.unique(array_normal))
 print("提取唯一元素", np.unique(array_normal, return_index=True))
 print("提取唯一元素", np.unique(array_normal, return_counts=True))
 print("提取唯一元素", np.unique(array_normal, return_index=True, return_inverse=True, axis=0))

数组的改变

数组转置

array_normal.T

reshape():把指定的数组改变形状,但是元素个数不变;有返回值,即不对原始多维数组进行修改

c = np.array([[[0, 1, 2],
    [10, 12, 13]],
    [[100, 101, 102],
    [110, 112, 113]]])
"""
[[[ 0 1]
 [ 2 10]]

 [[ 12 13]
 [100 101]]

 [[102 110]
 [112 113]]]
"""
print(c.reshape(3, 2, 2))
"""
[[ 0 1 2 10]
 [ 12 13 100 101]
 [102 110 112 113]]
"""
# 某一维指定为-1时,自动计算维度
print(c.reshape(3, -1))
"""[[[ 0 1]
 [ 2 10]
 [ 12 13]]

 [[100 101]
 [102 110]
 [112 113]]]"""
print(c.reshape(2, -1, 2))

resize():把指定的数组改变形状,但是元素个数可变,不足补0;无返回值,即对原始多维数组进行修改

a = np.array([[[0, 1, 2],
    [10, 12, 13]],
    [[100, 101, 102],
    [110, 112, 113]]])
b = np.array([[[0, 1, 2],
    [10, 12, 13]],
    [[100, 101, 102],
    [110, 112, 113]]])
'''[[0]
 [1]
 [2]]'''
a.resize((3, 1))
'''[[ 0 1 2 10 12]
 [ 13 100 101 102 110]
 [112 113 0 0 0]]'''
b.resize((3, 5))
print(a)
print(b)

*Numpy计算

条件运算

Numpy.where(condition, x, y):三目运算满足condition,为x;不满足condition,则为y

score = np.array([[80, 88], [82, 81], [84, 75], [86, 83], [75, 81]])
 # 如果数值小于80,替换为0,如果大于等于80,替换为90
 re_score = np.where(score < 80, 0, 90)
 print(re_score)

]统计运算

指定轴最大值:amax(参数1:数组;参数2:axis=0/1,0表示行1表示列)

# 求整个矩阵的最大值
result = np.amax(score)
print(result)
# 求每一列的最大值(0表示行)
result = np.amax(score, axis=0)
print(result)
# 求每一行的最大值(1表示列)
result = np.amax(score, axis=1)
print(result)

指定轴最小值:amin(参数1:数组;参数2:axis=0/1,0表示行1表示列)

# 求整个矩阵的最小值
result = np.amin(score)
print(result)
# 求每一列的最小值(0表示行)
result = np.amin(score, axis=0)
print(result)
# 求每一行的最小值(1表示列)
result = np.amin(score, axis=1)
print(result)

指定轴平均值:mean(参数1:数组;参数2:axis=0/1,0表示行1表示列;参数3:dtype,输出数据类型)

# 求整个矩阵的平均值
result = np.mean(score, dtype=np.int)
print(result)
# 求每一列的平均值(0表示行)
result = np.mean(score, axis=0)
print(result)
# 求每一行的平均值(1表示列)
result = np.mean(score, axis=1)
print(result)

指定轴方差:std(参数1:数组;参数2:axis=0/1,0表示行1表示列;参数3:dtype,输出数据类型)

# 求整个矩阵的方差
result = np.std(score)
print(result)
# 求每一列的方差(0表示列)
result = np.std(score, axis=0)
print(result)
# 求每一行的方差(1表示行)
result = np.std(score, axis=1)
print(result)

类似的,求和:Numpy.sum(),求中值:Numpy.median

数组运算

数组与数的运算(加、减、乘、除、取整、取模)

# 循环数组行和列,每一个数值都加5
score[:, :] = score[:, :]+5
print(score)
# 循环数组行和列,每一个数值都减5
score[:, :] = score[:, :]-5
print(score)
# 循环数组行和列,每一个数值都乘以5
score[:, :] = score[:, :]*5
print(score)
# 循环数组行和列,每一个数值都除以5
score[:, :] = score[:, :]/5
print(score)
# 循环数组行和列,每一个数值除以5取整
score[:, :] = score[:, :] // 5
print(score)
# 循环数组行和列,每一个数值除以5取模
score[:, :] = score[:, :] % 5
print(score)

数组间运算(加、减、乘、除),前提是两个数组的shape一样

加:“+”或者np.add(a, b)

减:“-”或者np.subtract(a, b)

乘:“*”或者np.multiply(a, b)

除:“/”或者np.divide(a, b)

c = score + score
 d = score - score
 e = score * score
 # 分母数组保证每个数值不能为0
 b = score / score

Numpy.intersect1d(参数 1:数组a;参数 2:数组b):查找两个数组中的相同元素

Numpy.setdiff1d(参数 1:数组a;参数 2:数组b):查找在数组a中不在数组b中的元素

Numpy.union1d(参数 1:数组a;参数 2:数组b):查找两个数组的并集元素

矩阵运算(一种特殊的二维数组)

计算规则

(M行,N列)*(N行,Z列)=(M行,Z列)

st_score = np.array([[80, 88], [82, 81], [84, 75], [86, 83], [75, 81]])
 # 平时成绩占40% 期末成绩占60%, 计算结果
 q = np.array([[0.4], [0.6]])
 result = np.dot(st_score, q)
 print(result)

矩阵拼接

矩阵垂直拼接(前提两个两个矩阵列数相同,行数随意):vstack(参数:tuple)

v1 = [[0, 1, 2, 3, 4, 5],
  [6, 7, 8, 9, 10, 11]]
v2 = [[12, 13, 14, 15, 16, 17],
  [18, 19, 20, 21, 22, 23],
  [18, 19, 20, 21, 22, 23]]
result = np.vstack((v1, v2))
print(result)

矩阵水平拼接(前提两个两个矩阵行数相同,列数随意):hstack(参数:tuple)

v1 = [[0, 1, 2, 3, 4, 5],
  [6, 7, 8, 9, 10, 11]]
 v2 = [[12, 13, 14, 15, 16, 17],
  [18, 19, 20, 21, 22, 23]]
 result = np.hstack((v1, v2))
 print(result)

矩阵删除:Numpy.delete(参数 1:a,数组;参数 2:elements,删除的对象;参数 3:axis=0/1)

OriginalY = np.array([[1, 2, 3],
      [4, 5, 6],
      [7, 8, 9]])
 print(np.delete(OriginalY, [0, 2]))
 print(np.delete(OriginalY, [0, 2], axis=0))
 print(np.delete(OriginalY, [0, 2], axis=1))

矩阵添加:Numpy.append(参数 1:array,数组;参数 2: elements,添加元素;参数 3: axis=0/1)

OriginalY = np.array([[1, 2, 3],
      [4, 5, 6],
      [7, 8, 9]])
# 末尾添加元素
print(np.append(OriginalY, [0, 2]))
# 最后一行添加一行
print(np.append(OriginalY, [[0, 2, 11]], axis=0))
# 最后一列添加一列(注意添加元素格式)
print(np.append(OriginalY, [[0], [2], [11]], axis=1))

矩阵插入:Numpy.insert(参数 1:array,数组;参数 2:index,插入位置索引;参数 3: elements,添加元素;参数 4: axis=0/1)

OriginalY = np.array([[1, 2, 3],
      [4, 5, 6],
      [7, 8, 9]])
print(np.insert(OriginalY, 1, [11, 12, 10]))
print(np.insert(OriginalY, 1, [[11, 12, 10]], axis=0))
# 在列索引1的位置插入(注意元素格式,跟添加格式不同)
print(np.insert(OriginalY, 1, [[11, 12, 10]], axis=1))

文件加载

np.loadtxt(fname,dtype,comments='#',delimiter=None,skiprows=0,usecols=None)

fname:读取的文件、文件名

dtype:数据类型

comments:注释

delimiter:分隔符,默认是空格

skiprows:跳过前几行读取,默认是0

usecols:读取哪些列,usecols=(1, 2, 5)读取第1,2,5列,默认所有列

到此这篇关于Python常用库Numpy进行矩阵运算详解的文章就介绍到这了,更多相关Python Numpy 矩阵运算内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python松散正则表达式用法分析
Apr 29 Python
Python语言描述机器学习之Logistic回归算法
Dec 21 Python
Python使用requests及BeautifulSoup构建爬虫实例代码
Jan 24 Python
python中的随机函数random的用法示例
Jan 27 Python
python实现requests发送/上传多个文件的示例
Jun 04 Python
python中join()方法介绍
Oct 11 Python
Python实现的远程文件自动打包并下载功能示例
Jul 12 Python
Python基本类型的连接组合和互相转换方式(13种)
Dec 16 Python
解决Keras 自定义层时遇到版本的问题
Jun 16 Python
pandas将list数据拆分成行或列的实现
Dec 13 Python
Python深度学习之Pytorch初步使用
May 20 Python
python中的3种定义类方法
Nov 27 Python
python按顺序重命名文件并分类转移到各个文件夹中的实现代码
Jul 21 #Python
Pandas的Apply函数具体使用
Jul 21 #Python
Python pandas对excel的操作实现示例
Jul 21 #Python
浅谈Python爬虫原理与数据抓取
Jul 21 #Python
用于ETL的Python数据转换工具详解
Jul 21 #Python
Python Tricks 使用 pywinrm 远程控制 Windows 主机的方法
Jul 21 #Python
Python json格式化打印实现过程解析
Jul 21 #Python
You might like
Zend Studio去除编辑器的语法警告设置方法
2012/10/24 PHP
php运行提示:Fatal error Allowed memory size内存不足的解决方法
2014/12/17 PHP
老版本PHP转义Json里的特殊字符的函数
2015/06/08 PHP
PHP会员找回密码功能的简单实现
2016/09/05 PHP
php中的异常和错误浅析
2017/05/03 PHP
JavaScript的parseInt 进制问题
2009/05/07 Javascript
jquery为页面增加快捷键示例
2014/01/31 Javascript
ECMAScript6的新特性箭头函数(Arrow Function)详细介绍
2014/06/07 Javascript
JavaScript中setUTCFullYear()方法的使用简介
2015/06/12 Javascript
基于JS实现数字+字母+中文的混合排序方法
2016/06/06 Javascript
大型JavaScript应用程序架构设计模式
2016/06/29 Javascript
webpack常用配置项配置文件介绍
2016/11/07 Javascript
详解js产生对象的3种基本方式(工厂模式,构造函数模式,原型模式)
2017/01/09 Javascript
用vue写一个仿简书的轮播图的示例代码
2018/03/13 Javascript
JS实现导出Excel的五种方法详解【附源码下载】
2018/03/15 Javascript
jQuery实现基本动画效果的方法详解
2018/09/06 jQuery
React手稿之 React-Saga的详解
2018/11/12 Javascript
Node.js一行代码实现静态文件服务器的方法步骤
2019/05/07 Javascript
Vue的状态管理vuex使用方法详解
2020/02/05 Javascript
js canvas实现五子棋小游戏
2021/01/22 Javascript
[08:44]DOTA2发布会群星聚首 我们都是刀塔人
2014/03/21 DOTA
[01:00:52]2018DOTA2亚洲邀请赛 4.4 淘汰赛 EG vs LGD 第一场
2018/04/05 DOTA
python监控linux内存并写入mongodb(推荐)
2017/09/11 Python
一个月入门Python爬虫学习,轻松爬取大规模数据
2018/01/03 Python
python实现三次样条插值
2018/12/17 Python
浅谈Python采集网页时正则表达式匹配换行符的问题
2018/12/20 Python
Python 异常的捕获、异常的传递与主动抛出异常操作示例
2019/09/23 Python
Keras SGD 随机梯度下降优化器参数设置方式
2020/06/19 Python
详解tensorflow之过拟合问题实战
2020/11/01 Python
shallow copy和deep copy的区别
2016/05/09 面试题
工商企业管理应届生求职信
2013/11/03 职场文书
劳动之星获奖感言
2014/02/01 职场文书
工程资料员岗位职责
2014/03/10 职场文书
2014年党员自我评价材料
2014/09/22 职场文书
物流仓管员岗位职责
2015/04/01 职场文书
Go语言编译原理之变量捕获
2022/08/05 Golang