陷阱一:數據結構混亂
array 和 matrix 都可以用來表示多維矩陣:
看起來效果不錯。假設我們要對數據進行篩選,取第 1 列的第 1 行和第 3 行數據構成一個 2 x 1 的列向量。先看對 array 的做法:
從 Out[101] 可以看到一個陷阱,a[:, 0] 過濾完應該是一個 3 x 1 的列向量,可是它變成了行向量。其實也不是真正意義上的行向量,因為行向量 shape 應該是 3 x 1,可是他的 shape 是 (3,) ,這其實已經退化為一個數組了。所以,導致最后 In [110] 出錯。只有像 In [111] 那樣 reshape 一下才可以。我不知道大家暈了沒有,我是已經快暈了。
相比之下,matrix 可以確保運算結果全部是二維的,結果相對好一點。為什么只是相對好一點呢?呆會兒我們再來吐吐 matrix 的槽點。
看起來還不錯。不過槽點就來了。Out [114] 我們預期的輸入結果應該是一個 2 x 1 的列向量,可是這里變成了 1 x 2 的行向量!
為什么我會在意行向量和列向量?在矩陣運算里,行向量和列向量是不同的。比如一個 m x 3 的矩陣可以和 3 x 1 的列向量叉乘,結果是 m x 1 的列向量。而如果一個 m x 3 的矩陣和 1 x 3 的行向量叉乘是會報錯的。
陷阱二:數據處理能力不足,語言效率低
我們再看個例子。假設 X 是 5 x 2 的矩陣,Y 是 5 X 1 的 bool 矩陣,我們想用 Y 來過濾 X ,即取出 Y 值為 True 的項的索引,拿這些索引去 X 里找出對應的行,再組合成一個新矩陣。
我們預期 X 過濾完是 3 x 2 列的矩陣,但不幸的是從 Out[81] 來看 numpy 這樣過濾完只會保留第一列的數據,且把它轉化成了行向量,即變成了 1 x 3 的行向量。不知道你有沒有抓狂的感覺。如果按照 In [85] 的寫法,還會報錯。如果要正確地過濾不同的列,需要寫成 In [86] 和 In [87] 的形式。但是即使寫成 In [86] 和 In [87] 的樣式,還是一樣把列向量轉化成了行向量。所以,要實現這個目的,得復雜到按照 In [88] 那樣才能達到目的。實際上,這個還達不到目的,因為那里面寫了好多硬編碼的數字,要處理通用的過濾情況,還需要寫個函數來實現。而這個任務在 matlab/octave 里只需要寫成 X(Y==1, :) 即可完美達成目的。
陷阱三:數值運算句法混亂
在機器學習算法里,經常要做一些矩陣運算。有時候要做叉乘,有時候要做點乘。我們看一下 numpy 是如何滿足這個需求的。
假設 x, y, theta 的值如下,我們要先讓 x 和 y 點乘,再讓結果與 theta 叉乘,最后的結果我們期望的是一個 5 x 1 的列向量。
直觀地講,我們應該會想這樣做:(x 點乘 y) 叉乘 theta。但很不幸,當你輸入 x * y 時妥妥地報錯。那好吧,我們這樣做總行了吧,x[:, 0] * y 這樣兩個列向量就可以點乘了吧,不幸的還是不行,因為 numpy 認為這是 matrix,所以執行的是矩陣相乘(叉乘),要做點乘,必須轉為 array 。
所以,我們需要象 In [39] 那樣一列列轉為 array 和 y 執行點乘,然后再組合回 5 x 3 的矩陣。好不容易算出了 x 和 y 的點乘了,終于可以和 theta 叉乘了。
看起來結果還不錯,但實際上這里面也是陷阱重重。
In [45] 會報錯,因為在 array 里 * 運算符是點乘,而在 matrix 里 * 運算符是叉乘。如果要在 array 里算叉乘,需要用 dot 方法。看起來提供了靈活性,實際上增加了使用者的大腦負擔。而我們的需求在 matlab/octave 里只需要寫成 x .* y * theta ,直觀優雅。
陷阱四:語法復雜,不自然
比如,我們要在一個 5 x 2 的矩陣的前面加一列全部是 1 的數據,變成一個 5 x 3 的矩陣,我們必須這樣寫:
有興趣的人可以數數 In [18] 里有多少個括號,還別不服,括號寫少了妥妥地報錯。而這個需求在 matlab/octave 里面只需要寫成[ones(5,1) x],瞬間腦袋不短路了,直觀優雅又回來了。
結論
有人說 python 是機器學習和數據分析的新貴,但和專門的領域語言 matlab/octave 相比,用起來確實還是比較別扭的。當然有些槽點是因為語言本身的限制,比如 python 不支持自定義操作符,導致 numpy 的一些設計不夠優雅和直觀,但默認把列向量轉化為行向量的做法只能說是 numpy 本身的設計問題了。這或許就是 Andrew Ng 在他的 Machine Learning 課程里用 matlab/octave ,而不用 python 或其他的語言的原因吧。
-
數據
+關注
關注
8文章
7002瀏覽量
88943 -
矩陣
+關注
關注
0文章
423瀏覽量
34528 -
機器學習
+關注
關注
66文章
8406瀏覽量
132567
原文標題:Numpy 隱含的四大陷阱,千萬別掉進去了!
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論