1. 程式人生 > >一起學python-opencv四(字串操作和陣列運算及矩陣運算)

一起學python-opencv四(字串操作和陣列運算及矩陣運算)

沒錯,這個應該是暫時的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。