摘要:前言對的意義非凡,在數據分析與機器學習領域為立下了汗馬功勞。現在用搞數據分析或機器學習經常使用的等庫,都需要基于構建。毫不夸張地說,沒有,今天在數據分析與機器學習領域只能是捉襟見肘。
前言
numpy對python的意義非凡,在數據分析與機器學習領域為python立下了汗馬功勞。現在用python搞數據分析或機器學習經常使用的pandas、matplotlib、sklearn等庫,都需要基于numpy構建。毫不夸張地說,沒有numpy,python今天在數據分析與機器學習領域只能是捉襟見肘。
什么是一門好的數據分析語言數據分析面向的數據大多數是二維表。一門好的數據分析語言,首先需要能夠直接有個數據結構存下這個二維表,然后要配上一套成熟的類SQL的數據操作接口,最后要有一套好用的可視化工具。R語言就是一個極好的典范:用內置的data.frame結構做數據的存儲;data.frame本身提供足夠強大的數據操作能力,另有dplyr、tidyr、data.table、plyr、reshape2等庫提供更好用更高效的數據操作能力;在繪圖上,除了基本的plot功能外,還提供了ggplot2這樣一套優雅的繪圖語言,還通過htmlwidget庫與javascript各種繪圖庫建立了緊密的聯系,讓可視化的動態展示效果更進一步。Excel也是一個極好的例子,有單元格這種靈活的結構為數據存儲做支撐,有大量的函數實現靈活的操作,也有強大的繪圖系統。
python目前在數據分析領域也已經具備了相當可觀的能力,包括pandas庫實現的DataFrame結構,pandas本身提供的數據操作能力,matplotlib提供的數據可視化能力,而這一切都離不開numpy庫。
什么是一門好的機器學習語言一般來講,一門好的機器學習語言在數據分析上也一定很吃得開,因為數據分析往往是機器學習的基礎。但是機器學習的要求更高,因為在模型訓練階段往往需要較為復雜的參數估計運算,因此語言需要具備較強的科學計算能力。科學計算能力,最核心的就是矩陣運算能力。關于矩陣運算能力,這篇文章對各種語言有很好的比較。
如果沒有numpy,python內部只能用list或array來表示矩陣。假如用list來表示[1,2,3],由于list的元素可以是任何對象,因此list中所保存的是對象的指針,所以需要有3個指針和三個整數對象,比較浪費內存和CPU計算時間。python的array和list不同,它直接保存數值,和C語言的一維數組比較類似,但是不支持多維,表達形式很簡陋,寫科學計算的算法很難受。numpy彌補了這些不足,其提供的ndarray是存儲單一數據類型的多維數組,且采用預編譯好的C語言代碼,性能上的表現也十分不錯。
python最流行的機器學習庫sklearn構建在numpy之上,提供了各種標準機器學習模型的訓練與預測接口,其中模型訓練接口的內部實現是基于numpy庫實現的。比如很常見的線性回歸模型,參數估計調用的是numpy.linalg.lstsq函數。
numpy的核心結構:ndarray以下內容摘錄自用Python做科學計算
a = np.array([[0,1,2],[3,4,5],[6,7,8]], dtype=np.float32)
ndarray是numpy的核心數據結構。我們來看一下ndarray如何在內存中儲存的:關于數組的描述信息保存在一個數據結構中,這個結構引用兩個對象,一塊用于保存數據的存儲區域和一個用于描述元素類型的dtype對象。
數據存儲區域保存著數組中所有元素的二進制數據,dtype對象則知道如何將元素的二進制數據轉換為可用的值。數組的維數、大小等信息都保存在ndarray數組對象的數據結構中。
strides中保存的是當每個軸的下標增加1時,數據存儲區中的指針所增加的字節數。例如圖中的strides為12,4,即第0軸的下標增加1時,數據的地址增加12個字節:即a[1,0]的地址比a[0,0]的地址要高12個字節,正好是3個單精度浮點數的總字節數;第1軸下標增加1時,數據的地址增加4個字節,正好是單精度浮點數的字節數。
以下內容總結自Numpy官方文檔Numpy basics
關于ndarray的索引方式,有以下幾個重點需要記住:
雖然x[0,2] = x0,但是前者效率比后者高,因為后者在應用第一個索引后需要先創建一個temporary array,然后再應用第二個索引,最后找到目標值。
分片操作不會引發copy操作,而是創建原ndarray的view;他們所指向的內存是同一片區域,無論是修改原ndarray還是修改view,都會同時改變二者的值。
index array和boolean index返回的是copy,不是view。
關于上面列舉的分片操作不會引發copy操作,我們來進一步探討一下。先看一下numpy的例子:
再來看一下R的例子:
可以看到numpy和R在矩陣的分片操作有不同的設計理念:在R里分片操作會引起數據的復制,在numpy里不會。事實上,R的設計理念很多時候可以用一句話來概括:copy on modify,一旦對數據有修改就會引起內存上的復制操作,這個操作要花不少時間,因此經常會聽到人們抱怨R費內存且速度慢。所以,我們可以看到numpy在處理這件事情上明顯要用心很多,根據場景設計了不同的策略,不是簡單地采用R的一刀切方式。當然,這也帶來了一些學習成本,需要對numpy足夠熟悉才能避免踩坑。R社區里對copy on modify的哲學也有詬病并在努力改變,比如同是data.frame操作庫的data.table和dplyr,data.table性能比dplyr高很多,部分原因也是data.table規避了copy on modify的方式。
Structured Array根據numpy的官方文檔,定義結構化數組有四種方式。本文采用字典方法,通過定義一個dtype對象實現,需要指定的鍵值有names和formats。
persontype = np.dtype({ "names": ["name", "age", "weight"], "formats": ["S32", "i", "f"] }) a = np.array([("Zhang", 32, 75.5), ("Wang", 24, 65.2)], dtype=persontype)
我們用IPython的計時函數看一下提取數據的效率:
%timeit a[1] %timeit a["name"] %timeit a[1]["name"] %timeit a["name"][1]
輸出結果如下:
The slowest run took 46.83 times longer than the fastest. This could mean that an intermediate result is being cached. 1000000 loops, best of 3: 153 ns per loop The slowest run took 34.34 times longer than the fastest. This could mean that an intermediate result is being cached. 10000000 loops, best of 3: 174 ns per loop The slowest run took 13.00 times longer than the fastest. This could mean that an intermediate result is being cached. 1000000 loops, best of 3: 1.08 μs per loop The slowest run took 9.84 times longer than the fastest. This could mean that an intermediate result is being cached. 1000000 loops, best of 3: 412 ns per loop
從上面的結果,我們發現,獲取相同的數據有多種操作,不同的操作性能差別很大。我做了一個推測,純粹是瞎猜:numpy在建立結構化數組時,將整個結構體連續存儲在一起,即按行存儲,因此a[1]的速度最快;但是為了保證提取列的效率,對a["name"]建立了索引,因此a["name"]的效率也很高;但是這個索引只對整個a起作用,如果輸入只有a的一部分,仍然需要遍歷整個a,去提取出對應的數據,因此a[1]["name"]比a["name"][1]的效率差很多。
關于作者:丹追兵:數據分析師一枚,編程語言python和R,使用Spark、Hadoop、Storm、ODPS。本文出自丹追兵的pytrafficR專欄,轉載請注明作者與出處:https://segmentfault.com/blog...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/38169.html
摘要:學習筆記七數學形態學關注的是圖像中的形狀,它提供了一些方法用于檢測形狀和改變形狀。學習筆記十一尺度不變特征變換,簡稱是圖像局部特征提取的現代方法基于區域圖像塊的分析。本文的目的是簡明扼要地說明的編碼機制,并給出一些建議。 showImg(https://segmentfault.com/img/bVRJbz?w=900&h=385); 前言 開始之前,我們先來看這樣一個提問: pyth...
摘要:簡介本文首發公眾號一名打字員據悉,年的月份,螞蟻金服已經宣布,螞蟻金服及阿里巴巴自研的關系型數據庫已經支撐起和淘寶的日常業務需求,成功替換了之前所采用的單機數據庫如或者開源的。 簡介 Tip:本文首發公眾號【一名打字員】 據悉,17年的4月份,螞蟻金服已經宣布,螞蟻金服及阿里巴巴自研的關系型數據庫OceanBase已經支撐起Tmall和淘寶的日常業務需求,成功替換了之前所采用的單機數據...
閱讀 3768·2023-04-25 21:09
閱讀 3128·2021-10-20 13:48
閱讀 2942·2021-09-24 10:25
閱讀 2931·2021-08-21 14:08
閱讀 1790·2019-08-30 15:56
閱讀 976·2019-08-30 15:52
閱讀 1841·2019-08-29 14:11
閱讀 3562·2019-08-29 11:01