摘要:前言對(duì)的意義非凡,在數(shù)據(jù)分析與機(jī)器學(xué)習(xí)領(lǐng)域?yàn)榱⑾铝撕柜R功勞?,F(xiàn)在用搞數(shù)據(jù)分析或機(jī)器學(xué)習(xí)經(jīng)常使用的等庫(kù),都需要基于構(gòu)建。毫不夸張地說(shuō),沒(méi)有,今天在數(shù)據(jù)分析與機(jī)器學(xué)習(xí)領(lǐng)域只能是捉襟見肘。
前言
numpy對(duì)python的意義非凡,在數(shù)據(jù)分析與機(jī)器學(xué)習(xí)領(lǐng)域?yàn)閜ython立下了汗馬功勞?,F(xiàn)在用python搞數(shù)據(jù)分析或機(jī)器學(xué)習(xí)經(jīng)常使用的pandas、matplotlib、sklearn等庫(kù),都需要基于numpy構(gòu)建。毫不夸張地說(shuō),沒(méi)有numpy,python今天在數(shù)據(jù)分析與機(jī)器學(xué)習(xí)領(lǐng)域只能是捉襟見肘。
什么是一門好的數(shù)據(jù)分析語(yǔ)言數(shù)據(jù)分析面向的數(shù)據(jù)大多數(shù)是二維表。一門好的數(shù)據(jù)分析語(yǔ)言,首先需要能夠直接有個(gè)數(shù)據(jù)結(jié)構(gòu)存下這個(gè)二維表,然后要配上一套成熟的類SQL的數(shù)據(jù)操作接口,最后要有一套好用的可視化工具。R語(yǔ)言就是一個(gè)極好的典范:用內(nèi)置的data.frame結(jié)構(gòu)做數(shù)據(jù)的存儲(chǔ);data.frame本身提供足夠強(qiáng)大的數(shù)據(jù)操作能力,另有dplyr、tidyr、data.table、plyr、reshape2等庫(kù)提供更好用更高效的數(shù)據(jù)操作能力;在繪圖上,除了基本的plot功能外,還提供了ggplot2這樣一套優(yōu)雅的繪圖語(yǔ)言,還通過(guò)htmlwidget庫(kù)與javascript各種繪圖庫(kù)建立了緊密的聯(lián)系,讓可視化的動(dòng)態(tài)展示效果更進(jìn)一步。Excel也是一個(gè)極好的例子,有單元格這種靈活的結(jié)構(gòu)為數(shù)據(jù)存儲(chǔ)做支撐,有大量的函數(shù)實(shí)現(xiàn)靈活的操作,也有強(qiáng)大的繪圖系統(tǒng)。
python目前在數(shù)據(jù)分析領(lǐng)域也已經(jīng)具備了相當(dāng)可觀的能力,包括pandas庫(kù)實(shí)現(xiàn)的DataFrame結(jié)構(gòu),pandas本身提供的數(shù)據(jù)操作能力,matplotlib提供的數(shù)據(jù)可視化能力,而這一切都離不開numpy庫(kù)。
什么是一門好的機(jī)器學(xué)習(xí)語(yǔ)言一般來(lái)講,一門好的機(jī)器學(xué)習(xí)語(yǔ)言在數(shù)據(jù)分析上也一定很吃得開,因?yàn)閿?shù)據(jù)分析往往是機(jī)器學(xué)習(xí)的基礎(chǔ)。但是機(jī)器學(xué)習(xí)的要求更高,因?yàn)樵谀P陀?xùn)練階段往往需要較為復(fù)雜的參數(shù)估計(jì)運(yùn)算,因此語(yǔ)言需要具備較強(qiáng)的科學(xué)計(jì)算能力??茖W(xué)計(jì)算能力,最核心的就是矩陣運(yùn)算能力。關(guān)于矩陣運(yùn)算能力,這篇文章對(duì)各種語(yǔ)言有很好的比較。
如果沒(méi)有numpy,python內(nèi)部只能用list或array來(lái)表示矩陣。假如用list來(lái)表示[1,2,3],由于list的元素可以是任何對(duì)象,因此list中所保存的是對(duì)象的指針,所以需要有3個(gè)指針和三個(gè)整數(shù)對(duì)象,比較浪費(fèi)內(nèi)存和CPU計(jì)算時(shí)間。python的array和list不同,它直接保存數(shù)值,和C語(yǔ)言的一維數(shù)組比較類似,但是不支持多維,表達(dá)形式很簡(jiǎn)陋,寫科學(xué)計(jì)算的算法很難受。numpy彌補(bǔ)了這些不足,其提供的ndarray是存儲(chǔ)單一數(shù)據(jù)類型的多維數(shù)組,且采用預(yù)編譯好的C語(yǔ)言代碼,性能上的表現(xiàn)也十分不錯(cuò)。
python最流行的機(jī)器學(xué)習(xí)庫(kù)sklearn構(gòu)建在numpy之上,提供了各種標(biāo)準(zhǔn)機(jī)器學(xué)習(xí)模型的訓(xùn)練與預(yù)測(cè)接口,其中模型訓(xùn)練接口的內(nèi)部實(shí)現(xiàn)是基于numpy庫(kù)實(shí)現(xiàn)的。比如很常見的線性回歸模型,參數(shù)估計(jì)調(diào)用的是numpy.linalg.lstsq函數(shù)。
numpy的核心結(jié)構(gòu):ndarray以下內(nèi)容摘錄自用Python做科學(xué)計(jì)算
a = np.array([[0,1,2],[3,4,5],[6,7,8]], dtype=np.float32)
ndarray是numpy的核心數(shù)據(jù)結(jié)構(gòu)。我們來(lái)看一下ndarray如何在內(nèi)存中儲(chǔ)存的:關(guān)于數(shù)組的描述信息保存在一個(gè)數(shù)據(jù)結(jié)構(gòu)中,這個(gè)結(jié)構(gòu)引用兩個(gè)對(duì)象,一塊用于保存數(shù)據(jù)的存儲(chǔ)區(qū)域和一個(gè)用于描述元素類型的dtype對(duì)象。
數(shù)據(jù)存儲(chǔ)區(qū)域保存著數(shù)組中所有元素的二進(jìn)制數(shù)據(jù),dtype對(duì)象則知道如何將元素的二進(jìn)制數(shù)據(jù)轉(zhuǎn)換為可用的值。數(shù)組的維數(shù)、大小等信息都保存在ndarray數(shù)組對(duì)象的數(shù)據(jù)結(jié)構(gòu)中。
strides中保存的是當(dāng)每個(gè)軸的下標(biāo)增加1時(shí),數(shù)據(jù)存儲(chǔ)區(qū)中的指針?biāo)黾拥淖止?jié)數(shù)。例如圖中的strides為12,4,即第0軸的下標(biāo)增加1時(shí),數(shù)據(jù)的地址增加12個(gè)字節(jié):即a[1,0]的地址比a[0,0]的地址要高12個(gè)字節(jié),正好是3個(gè)單精度浮點(diǎn)數(shù)的總字節(jié)數(shù);第1軸下標(biāo)增加1時(shí),數(shù)據(jù)的地址增加4個(gè)字節(jié),正好是單精度浮點(diǎn)數(shù)的字節(jié)數(shù)。
以下內(nèi)容總結(jié)自Numpy官方文檔Numpy basics
關(guān)于ndarray的索引方式,有以下幾個(gè)重點(diǎn)需要記?。?/p>
雖然x[0,2] = x0,但是前者效率比后者高,因?yàn)楹笳咴趹?yīng)用第一個(gè)索引后需要先創(chuàng)建一個(gè)temporary array,然后再應(yīng)用第二個(gè)索引,最后找到目標(biāo)值。
分片操作不會(huì)引發(fā)copy操作,而是創(chuàng)建原ndarray的view;他們所指向的內(nèi)存是同一片區(qū)域,無(wú)論是修改原ndarray還是修改view,都會(huì)同時(shí)改變二者的值。
index array和boolean index返回的是copy,不是view。
關(guān)于上面列舉的分片操作不會(huì)引發(fā)copy操作,我們來(lái)進(jìn)一步探討一下。先看一下numpy的例子:
再來(lái)看一下R的例子:
可以看到numpy和R在矩陣的分片操作有不同的設(shè)計(jì)理念:在R里分片操作會(huì)引起數(shù)據(jù)的復(fù)制,在numpy里不會(huì)。事實(shí)上,R的設(shè)計(jì)理念很多時(shí)候可以用一句話來(lái)概括:copy on modify,一旦對(duì)數(shù)據(jù)有修改就會(huì)引起內(nèi)存上的復(fù)制操作,這個(gè)操作要花不少時(shí)間,因此經(jīng)常會(huì)聽到人們抱怨R費(fèi)內(nèi)存且速度慢。所以,我們可以看到numpy在處理這件事情上明顯要用心很多,根據(jù)場(chǎng)景設(shè)計(jì)了不同的策略,不是簡(jiǎn)單地采用R的一刀切方式。當(dāng)然,這也帶來(lái)了一些學(xué)習(xí)成本,需要對(duì)numpy足夠熟悉才能避免踩坑。R社區(qū)里對(duì)copy on modify的哲學(xué)也有詬病并在努力改變,比如同是data.frame操作庫(kù)的data.table和dplyr,data.table性能比dplyr高很多,部分原因也是data.table規(guī)避了copy on modify的方式。
Structured Array根據(jù)numpy的官方文檔,定義結(jié)構(gòu)化數(shù)組有四種方式。本文采用字典方法,通過(guò)定義一個(gè)dtype對(duì)象實(shí)現(xiàn),需要指定的鍵值有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的計(jì)時(shí)函數(shù)看一下提取數(shù)據(jù)的效率:
%timeit a[1] %timeit a["name"] %timeit a[1]["name"] %timeit a["name"][1]
輸出結(jié)果如下:
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
從上面的結(jié)果,我們發(fā)現(xiàn),獲取相同的數(shù)據(jù)有多種操作,不同的操作性能差別很大。我做了一個(gè)推測(cè),純粹是瞎猜:numpy在建立結(jié)構(gòu)化數(shù)組時(shí),將整個(gè)結(jié)構(gòu)體連續(xù)存儲(chǔ)在一起,即按行存儲(chǔ),因此a[1]的速度最快;但是為了保證提取列的效率,對(duì)a["name"]建立了索引,因此a["name"]的效率也很高;但是這個(gè)索引只對(duì)整個(gè)a起作用,如果輸入只有a的一部分,仍然需要遍歷整個(gè)a,去提取出對(duì)應(yīng)的數(shù)據(jù),因此a[1]["name"]比a["name"][1]的效率差很多。
關(guān)于作者:丹追兵:數(shù)據(jù)分析師一枚,編程語(yǔ)言python和R,使用Spark、Hadoop、Storm、ODPS。本文出自丹追兵的pytrafficR專欄,轉(zhuǎn)載請(qǐng)注明作者與出處:https://segmentfault.com/blog...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/38169.html
摘要:學(xué)習(xí)筆記七數(shù)學(xué)形態(tài)學(xué)關(guān)注的是圖像中的形狀,它提供了一些方法用于檢測(cè)形狀和改變形狀。學(xué)習(xí)筆記十一尺度不變特征變換,簡(jiǎn)稱是圖像局部特征提取的現(xiàn)代方法基于區(qū)域圖像塊的分析。本文的目的是簡(jiǎn)明扼要地說(shuō)明的編碼機(jī)制,并給出一些建議。 showImg(https://segmentfault.com/img/bVRJbz?w=900&h=385); 前言 開始之前,我們先來(lái)看這樣一個(gè)提問(wèn): pyth...
摘要:簡(jiǎn)介本文首發(fā)公眾號(hào)一名打字員據(jù)悉,年的月份,螞蟻金服已經(jīng)宣布,螞蟻金服及阿里巴巴自研的關(guān)系型數(shù)據(jù)庫(kù)已經(jīng)支撐起和淘寶的日常業(yè)務(wù)需求,成功替換了之前所采用的單機(jī)數(shù)據(jù)庫(kù)如或者開源的。 簡(jiǎn)介 Tip:本文首發(fā)公眾號(hào)【一名打字員】 據(jù)悉,17年的4月份,螞蟻金服已經(jīng)宣布,螞蟻金服及阿里巴巴自研的關(guān)系型數(shù)據(jù)庫(kù)OceanBase已經(jīng)支撐起Tmall和淘寶的日常業(yè)務(wù)需求,成功替換了之前所采用的單機(jī)數(shù)據(jù)...
閱讀 3952·2023-04-25 21:09
閱讀 3198·2021-10-20 13:48
閱讀 3178·2021-09-24 10:25
閱讀 3007·2021-08-21 14:08
閱讀 1854·2019-08-30 15:56
閱讀 1055·2019-08-30 15:52
閱讀 1947·2019-08-29 14:11
閱讀 3638·2019-08-29 11:01