一起学python-opencv四(字符串操作和数组运算及矩阵运算)

版权声明: https://blog.csdn.net/qq_41740705/article/details/82748264

没错,这个应该是暂时的numpy的第一阶段学习的最后一讲。在下一讲将要先回归到opencv,因为暂时这些numpy的知识肯定是够好几讲用的,numpy这个东西确实有点枯燥,所以先回归到opencv应用一下,理论到实践的过程是需要的。我们还是耐心地

字符串函数

 

 

 

add是有广播机制的。center这个20应该是指定输出字符串的一个宽度,U20其实就是长度为20的字符串了,默认应该是utf-8,U20的bits是20×8=160。

 

如果数组元素有非字符串的,用过这些字符串处理函数就会强行转换为字符串。

 

 

 

 

 

cp500是什么呢?参考了

https://blog.csdn.net/miqi770/article/details/43935273

 

这些split啊,replace啊,strip,upper,lower,join啊这些函数python都有,这里用法其实都差不多。

数学算数函数

 

 

 

 

三角和反三角函数其实在python里的math模块就有,MATLAB里也有,不过反三角分别是asin,acos和atan,参数都是弧度而不是角度,弧度相互角度转化也是比较简单的了。

 

 

 

这些四舍五入的函数python也自带有,不过不能对整个数组的所有元素操作,我们可能可以写一个循环遍历数组,对每一个元素利用python中自带的处理函数进行处理,不过那就有点麻烦了,不如直接利用numpy提供的函数。

算术运算

 

 

这些函数其实可以用+-*/简单的符号来代替。

 

 

 

 

如果dtype是整数,才会采用//,地板除,也就是整除。0的倒是会取inf,也就是无穷。

power的功能用**完全可以做到,应该是有对应的魔法方法的。这个倒数的功能我们仔细想想1/a也完全可以做到。

 

 

 

real,imag,angle,conj这几个函数还算有点用处,虽然我们可以自己搞出来,但是直接用简单啊,说到复数,这里漏了一个abs,求幅值的,这些函数MATLAB里也都有。

统计函数

 

 

如果不指定轴,返回的是整个数组里面的最值。

 

ptp的意思就是peak to peak,就峰峰值的意思。

 

这个解释可能有点让人懵逼,又参考了一下:https://blog.csdn.net/NockinOnHeavensDoor/article/details/78765556

 

 

 

 

相对来说percentile这个函数用的少一些。

 

 

 

 

average和mean的差别是average是可以加权的,就是数学中的期望的概念,上面的weights需要指定关键字参数的原因是第二个参数是axis。关于轴的问题,二维数组0轴就是行,1就是列,对于三维,我的建议是大家画一个三维图看看,我在前面曾经画过这样的图。

 

排序、搜索和计数函数

 

 

 

注意如果不指定轴,会按照最后一个轴排,下面就是按照1轴排列的。只要说是间接排序或者说是产生副本的,都不会对原数组产生影响。

 

argsort的好处在于可以返回数组的索引,它们返回的顺序都是从大到小,想要从小到大的话,如果元素是数字,可以加一个-就完事了。字符串不能加-。

 

当元素是字符串的时候,进行字符串比较。字符串比较是从第一个字符的ascii码开始比起,如果一样,继续比第二个,如果有的字符串没有第二个,那么字符串长的判定为大,依次类推。这个lexsort这里说的不是很清晰,参考https://blog.csdn.net/haiyang_duan/article/details/79221458

 

这个博主写的真的很清楚。

 

 

 

argmax,argmin都是返回索引的,如果函数不给定轴,会按照靠后的轴排列。这个带arg的好像都是都是返回索引的,不过我这里要吐槽,还是MATLAB这方面要方便一点,[v,i]=max(a),返回的值里,v是最小值,i就是最小值的索引,一个函数就搞定了,min也是一样。

 

 

我不得不说在MATLAB里面一个find函数可以实现上面三个函数的功能。不过我们目前学的是numpy,也就只能按照人家的来,除非你自己去优化numpy模块的代码。

 

 

字节交换

 

这个可能会用到吧,其实汇编啊,c语言都有类似的函数。

副本和视图

 

 

 

 

 

 

 

前面我们的运算都是对元素而言的,有没有像矩阵的乘法这种的运算呢?是有的,就在下面。

线性代数

 

为什么二维相当于矩阵乘法呢?因为矩阵就是两个维度嘛。

 

 

 

不知道你们发现没有,上面最后inner(a,b)的结果和矩阵运算的a*bT是一样的。

 

 

这个三维的过程我来展示一下:

 

[0 1;2 3]*[0 1;2 3]的结果是[0*0+1*2 0*1+1*3; 2*0+2*3 1*2+3*3],我觉得还是可以看懂的。更高维度的我觉得没有必要去研究。

 

 

首先只有方阵才可以求行列式的,这里面也是分左乘右乘的,3x2的矩阵可以乘以2×2的,但是2×2数组不能乘以3×2的数组,因为不符合矩阵的乘法规则。

 

 

 

结果也可以使用下列函数获取

x = np.dot(ainv,b)

这个1.11022302e-16是因为计算精度问题。

 

我们不能像MATLAB里面一样直接用矩阵的形式嘛?是可以的。

矩阵库

 

 

 

 

看到返回的的确不是ndarray对象。

 

 

 

矩阵生成的时候括号里面必须要用引号引起来,然后,空格和分号的意义就和MATLAB里是一样的。不过可以像数组那样生成,用中括号,下面第二个例子就是。

 

下面提供了一个MRO顺序,说明matrix是继承了numpy.ndarray的。

 

如果给矩阵输入三维数组会报错。

 

这个乘法是直接是矩阵乘法。报错的原因是不符合矩阵乘法规则,是(2,1)和(2,2)没有对齐,1(左边矩阵的第一个维度的值,dim是dimension的缩写)不等于2(右边矩阵维度0对应的值)。

 

**在这里也不是对元素来说了而是对应矩阵乘的乘方,这就要求矩阵必须是方阵。不然就报错。+-和/不是矩阵运算的意思,是和ndarray的一样的,都有广播机制,这也不奇怪,matrix是继承了ndarray的。

 

MATLAB里面是直接可以用/和\的,并且这两个还不一样a/b是a*inv(b)而a\b是b*inv(a)。这些其实还不够,我们直接help(numpy.linalg)看一看还有哪些函数。

 

这些暂时就够我们用了我们来介绍一下这些函数。norm是求范数的,inv是求逆的,由于只有方阵才可以求逆而且有的矩阵是奇异的,也就是不可逆的,所以还有一个pinv,求的是伪逆,具体怎么求我就不介绍了。lstsq是解决最小二乘问题的一个函数,matrix_power是求方阵的整数次方的函数,eig是求特征值和特征向量的,eigh是求埃米希特矩阵的特征值和特征向量的,eigvals是求一个方阵的特征值,eigvalsh是求埃米希特(有的也译为厄米特)矩阵的特征值。qr是做QR分解的,svd是做奇异值分解的,cholesky也是做矩阵分解的。上面有的名词还是需要一定线性代数和计算方法基础才能知道的,上面还缺一个伴随矩阵,为什么不写呢?因为伴随矩阵可以用det和inv求出,这个算是比较基本的知识了。下面来看几个函数的帮助,里面都是有例子的。

 

a**-1也是可以求逆的,范数的参数输入里面有一个ord,是输入范数的种类,范数有很多种,有一范数,二范数,无穷范数等。对于矩阵和向量来说,范数的计算方式是会不一样的。

 

例子。

 

 

w是特征值的一个一维数组,v是特征向量组成的矩阵或者说二维数组,每一列是一个特征向量,和特征值的位置是对应的,特征值在第一列,那么特征向量也在。1的特征向量是[1 0 0]T。

 

diag也是生成元素的一个函数,前面也介绍过,这个函数里填的是对角线上的元素,其它元素全部填0。奇异值分解时特征值在任意矩阵中的推广。

 

 

 

这些我觉得我没必要演示,第一是因为例子挺多的,第二是因为这个演示了如果没有一定基础看不出来结果的正确与否,我又不想花费大量篇幅来讲线性代数。

那么numpy学习先暂停一下,先回到opencv。

猜你喜欢

转载自blog.csdn.net/qq_41740705/article/details/82748264