精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Numpy居然有這么多陷阱?

馬哥Linux運維 ? 來源:lq ? 2018-12-03 16:37 ? 次閱讀

陷阱一:數據結構混亂

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

    文章

    6909

    瀏覽量

    88850
  • 矩陣
    +關注

    關注

    0

    文章

    422

    瀏覽量

    34504
  • 機器學習
    +關注

    關注

    66

    文章

    8382

    瀏覽量

    132444

原文標題:Numpy 隱含的四大陷阱,千萬別掉進去了!

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    看了這么多論壇 還是這個論壇好啊...

    其他的論壇沒有這么多人,沒有這么快的更新.... 你們覺得呢?
    發表于 04-17 10:52

    電阻的作用居然有這么多

    更改;可以用于在最短回流路徑斷裂時提供較小的回流路徑,減小干擾;可以有效的限制環路電流,使噪聲得到抑制;可以作為溫度補償器……零歐姆電阻竟然這么有用,小伙伴們有木有驚呆了呢~~  電阻的作用
    發表于 10-16 00:14

    這是spi讀華邦flash W24X16,我不明白這里這里怎么有這么多模式

    1 這是spi讀華邦flash W24X16,我不明白這里這里怎么有這么多模式,只覺得有主從模式和全雙工模式,不明白簡單的雙向數據線/主模式和全雙工模式/主模式有什么區別?想請大家幫我講解下這幅圖配置里的這么多模式相互之間的區別?2 還想問SPIx_NSS選擇硬件模式,主
    發表于 04-09 11:30

    AVR單片機,在ICCAVR里輸入了幾行程序,可是運行后有這么多錯誤,請問是什么原因呢?

    我是單片機的初學者,今天按照課本在ICCAVR里輸入了幾行程序,可是運行后有這么多錯誤,請問是什么原因呢?
    發表于 10-25 11:46

    為什么roll一上電就飄了這么多

    放在水平位置上校準之后pitch還是挺準的,roll一上電就飄了這么多,為什么??
    發表于 07-04 04:35

    為什么OLED初始化的時候要這么多命令?

    void OLED_Init(void)這個函數里面要寫的命令好多啊,不知道為什么初始化的時候要這么多命令啊??求解具體在數據手冊哪幾頁
    發表于 09-18 23:58

    什么是VBA?為什么這么多軟件支持VBA?

    什么是VBA?什么是VBS?二者有什么不同?為什么這么多軟件支持VBA?
    發表于 07-02 06:35

    STM32系統為什么要有時鐘?為什么有這么多個時鐘源

    STM32系統為什么要有時鐘?為什么有這么多個時鐘源?STM32系統時鐘的框架是由哪些部分組成的?
    發表于 11-22 07:00

    為什么有這么多編程語言呢

    關注+星標公眾號,不錯過精彩內容編排|strongerHuang微信公眾號 |嵌入式專欄有很多初學者都會問:我到底是該學C語言,還是學C++,或者JAVA呢?為什么有這么多編程語言呢...
    發表于 01-12 06:34

    RK3399居然有這么強的解碼能力?

    的比較多,今天自己親自動手測試下還是嚇了一跳,沒想到RK3399居然有這么強的解碼能力?一、什么是MPP?Media Process Platform (MPP) module directory
    發表于 09-08 16:42

    RK3399居然有這么強的解碼能力?

    的比較多,今天自己親自動手測試下還是嚇了一跳,沒想到RK3399居然有這么強的解碼能力?一、什么是MPP?Media Process Platform (MPP) module directory
    發表于 10-09 18:02

    安卓8.0最新消息:安卓8.0初體驗,竟然這么流暢還有這么多黑科技功能

    安卓8.0初體驗,竟然這么流暢還有這么多黑科技功能
    發表于 04-13 09:00 ?3623次閱讀

    小墊圈,里面還有這么多名堂……

    小墊圈,里面還有這么多名堂……
    的頭像 發表于 07-02 11:40 ?2652次閱讀

    選AC-DC電源適配器還有這么多門道?看完才知道

    選AC-DC電源適配器還有這么多門道?看完才知道
    的頭像 發表于 07-02 11:40 ?6122次閱讀

    硬件電路設計有這么多坑,如何少走彎路?看大牛怎么說

    硬件電路設計有這么多坑,如何少走彎路?看大牛怎么說
    的頭像 發表于 11-27 17:34 ?613次閱讀