| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> Python-Numpy中的矩阵和数组运算 -> 正文阅读 |
|
[人工智能]Python-Numpy中的矩阵和数组运算 |
目录 〇 、前言最近这段时间开始了我的机器学习的python踩坑之旅,毕竟之前主要在matlab上coding的,而matlab对矩阵的处理那是非常非常方便的,导致我被惯坏了,在转到用python写框架时还保持着matlab时的思维,全线飘红,不过主要是自己太菜,对numpy的一些机制不了解,经过不断search后,写下这篇笔记。 一 、数组(Array)与矩阵(Matrix)首先我们得弄清楚numpy中数组与矩阵的区别:Matrix必须是2维的,但是Array可以是多维的,一维二维到N维,Matrix是Array的一个小的分支,包含于Array。所以Matrix 拥有Array的所有特性。对于刚接触机器学习的我们很容易会被迷惑住双眼,因为我们平时接触到的数据维度基本停留在二维,又由于Matrix 拥有Array的所有特性,两者也都都可以进行加减乘除的运算,当我们在处理其他维度的数据时就很容易混用,导致出错。 *讲讲一维数据(一行或一列数据)
coding经常出错的地方是对一维数据的处理,我将给出几个例子,大家很容易就能理解。 Example1?
可以看到,我们都只是想构造一个可以存储5个数据的容器,但两者的shape是不一样的。此时a是二维数组(也可以说他就是个Matrix,这种情况下Array和Matrix确实是没区别的),a是一个有1个数据“宽度”,有5个数据“长度”的“面”;而此时b是一维数组,通过shape也可以看出,b是一条只有5个数据的“长度”的“线”,没有“宽度”,因此它不是Matrix,是不能对其进行转置求逆等操作的。
虽然在我们看来存的同样都是一个维度的数据,但两者的机制是不一样的,shape也不一样,numpy运算对容器之间的shape会有严格的要求,所以需要特别注意维度问题。 Example2
这个例子是用冒号取d的第4列数据k,此时k的shape是(3,),k是一维数组,不是列向量,拿去做其他运算的时候shape会有很大问题。 不仅仅是这个例子,有很多函数他们返回的也是一维数组,也会造成很多纬度上的问题出现,大家要提前了解好要用的函数返回的是什么类型的数据。 numpy.matrix()如果想让k是一个列向量,此时就得用numpy.matrix()来将数组转化为Matrix。
?可以看到转成Matrix后shape并不是我们想要的列向量的(3,1),虽然我们脑子里认为取的是一列,但电脑不这么认为,因为d[:, 3]返回的就是“一行数据”(一维数组),转成Matrix后是行向量,所以需要把它加一个转置变成我们想要的列向量。这一点也是很多freshman很容易忽略的。
二 、各种运算下面我将从运算目的和数据维度将各种常用的运算分好类别,大家看菜吃饭。这里都是拿一维和二维的数据讲解,把这个弄懂,更高维度的也是很容易理解的。其他比较少用运算的大家要善用Google,看看文档。 0、数组或矩阵的每个元素都乘(加减除···)某个数这里numpy会将这单个数广播(broadcast)成和前面那个数组或矩阵一样shape的数组或矩阵,再进行元素级别的运算
1、矩阵的点积(加减)运算维度要求就是按照线性代数的维度要求,点积要求“前列等于后行”,加减要求整个shape都一样。
这里要注意如果直接用 “*” 来点积的话,e和f的类型必须至少有一个是Matrix类型,要用numpy.matrix(),或者用np.dot()。
如果g(ndarray)*h(ndarray)的话numpy会认为你是在做数组对应位元素间的运算,会自动broadcast,但维度不符合broadcast规则就报错,就算维度刚刚好没问题,但做的也不是我们想要的点积运算。
2、数组间对应位元素的运算?①、两数组的shape完全一样
?②、不同shape的就broadcast
对于广播机制,用文字说的话感觉会越说越晕,毕竟情况还是很多的,建议大家还是走传送门看大佬讲,动手做几次就能feel到它是怎么操作的,其实还是很好理解的。? 三、后记python处理矩阵和数组还是比matlab麻烦不少,但主要会出错搞乱的地方就是一维数组和(二、1)这里,会因为shape不匹配造成很多运算维度出错问题,只要自己清楚这个容器是什么类型,shape是多少,配合类型转换和转置等操作,就能解决问题了。 如果我说的有纰漏,希望大佬们指出错误。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 14:38:57- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |