中文字幕理论片,69视频免费在线观看,亚洲成人app,国产1级毛片,刘涛最大尺度戏视频,欧美亚洲美女视频,2021韩国美女仙女屋vip视频

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
Python 數(shù)據(jù)分析:Numpy 介紹


來源:by777

segmentfault.com/a/1190000011372128

如有好文章投稿,請點擊 → 這里了解詳情


前言


NUMPY(以下簡稱NP)是Python數(shù)據(jù)分析必不可少的第三方庫,np的出現(xiàn)一定程度上解決了Python運算性能不佳的問題,同時提供了更加精確的數(shù)據(jù)類型。如今,np被Python其它科學(xué)計算包作為基礎(chǔ)包,已成為Python 數(shù)據(jù)分析的基礎(chǔ),可以說,NP是SciPy、Pandas等數(shù)據(jù)處理或科學(xué)計算庫最基本的函數(shù)功能庫。因此,理解np的數(shù)據(jù)類型對python數(shù)據(jù)分析十分有幫助。


下面,本文將介紹Np的常用操作和基本數(shù)據(jù)類型。


NP提供了以下重點功能。


  • 一個強大的N維數(shù)組對象ndarray

  • 廣功能函數(shù)

  • 整合C/C++/Fortran代碼的工具

  • 提供了線性代數(shù)、傅里葉變換、隨機數(shù)生成的相關(guān)功能


為了更加直觀的了解Np的強大與作用,我們先看作用再看方法:


使用NUMPY操作數(shù)據(jù)集


在操作數(shù)據(jù)之前,我們先來理解什么是維度:


什么是維度


維度是一組數(shù)據(jù)的組織形式,不同數(shù)據(jù)維度可能表示不同的含義。一維數(shù)據(jù)由對等關(guān)系的有序或無序數(shù)據(jù)構(gòu)成,采用線性方式組織,可以用數(shù)組表示。


通俗來講,


1,2,3,4


這么一行數(shù)據(jù)就可以稱之為一維數(shù)據(jù),但如果我們再對其折疊:


1,2,

3,4


那么他就成為了二維數(shù)據(jù),又可以稱之為矩陣。


什么是數(shù)據(jù)集


數(shù)據(jù)集,顧名思義就是數(shù)據(jù)的集合,是用以訓(xùn)練程序的數(shù)據(jù)集合,一般是二維或者多維數(shù)表。


如果我們想自己手工新建一個數(shù)據(jù)集,可以直接新建一個文本文件,只要有恰當(dāng)?shù)臄?shù)據(jù),都可以稱之為數(shù)據(jù)集:


城市,環(huán)比,同比,定基

北京,100.1,100.2,100.3

上海,111.1,111.2,111.3

南京,133.0,133.3,133.4


比如這樣,我們就可以稱上面的文件稱之為數(shù)據(jù)集。我們還注意到,上面數(shù)據(jù)是使用逗號作為分隔符分隔數(shù)據(jù)的,它簡單描述了數(shù)據(jù)的內(nèi)容和含義,并使用半角逗號作為分隔符。像這樣,用逗號分隔的數(shù)據(jù)集就稱之為CSV(Comma-Separated Value,逗號分隔值)數(shù)據(jù)集,它是一種常見的文件格式,用來存儲批量的數(shù)據(jù)。它就像一張excel表,用來存儲簡單結(jié)構(gòu)的數(shù)據(jù)。


怎么樣,數(shù)據(jù)集的概念是否特別簡單呢?


生成數(shù)據(jù)集


數(shù)據(jù)集是一個簡單的概念,但每次使用手工的方式去寫畢竟不方便,所以,我們可以使用np的內(nèi)置函數(shù)來生成數(shù)據(jù)集:


np.savetxt(frame,array,fmt='%.18e',delimiter=None)


  • frame:文件、字符串、或產(chǎn)生器的名字,可以是.gz,.bz2的壓縮文件

  • arrray:存入文件的NP的數(shù)組

  • fmt(format):寫入文件的格式,如%d,%.2f,%.18e(默認(rèn),科學(xué)計數(shù)法保留18位)

  • delemiter:分割字符串,默認(rèn)是任何空格。


我們可以這樣寫下代碼:


a= np.arange(20).reshape(4,5)

np.savetxt('demo.csv',a,fmt='%d',delimiter=',')


這樣,我們就會在當(dāng)前的工作目錄下發(fā)現(xiàn)一個新的demo.csv,用記事本打開,里面是一個4 * 5的矩陣,元素0~19。


讀取數(shù)據(jù)集


既然生成,那就可以讀取,同樣使用np:


np.loadtxt(frame,dtype=np.float,delimiter=None,inpack=False)


  • frame:指定讀入的文件來源

  • dtype:數(shù)據(jù)類型,默認(rèn)為np.float。

  • delimiter:分割字符串

  • unpack:默認(rèn)為False讀入文件寫入一個數(shù)組,如果為True,讀入屬性將分別寫入不同變量


同樣的我們只需要寫下代碼:


np.loadtxt('demo.csv',delimiter=',')


就可以查看到我們先前寫入的數(shù)組a。


CSV文件的局限


可以發(fā)現(xiàn),CSV文件只能有效存儲和讀取一維和二維數(shù)組,因為更高的維度無法更直觀的文本下顯現(xiàn)出來,這時,更加靈活的存取方式就呼之欲出了,但講之前先賣個關(guān)子,再介紹一個不太常用的方法:


tofile:對于NP中的ndarray數(shù)組,我們可以使用NP中的tofile方法。


a.tofile(frame,sep='',format='%d')


  • frame:文件,字符串

  • 數(shù)據(jù)分割字符串,如果不寫,將使用二進制文件存儲

  • format:寫入數(shù)據(jù)的格式


同樣,我們只需要命令:


import numpy as np

a = np.arange(100).reshape(5,10,2)

a.tofile('a.dat',sep=',',format='%d')


就可以生成新的CSV數(shù)據(jù)集。


此時,我們?nèi)绻蜷_a.dat文件,我們可以看到數(shù)組1,2,3……99。但是與CSV不同,這個文件并沒有包含數(shù)字的維度信息,他只是將數(shù)組所有元素逐一的列出。而且如果我們不指定sep,將保存為二進制文件,雖然對人不可讀,但將占用更小的空間。


既然tofile可以保存文本文件,那么也很容易猜到對應(yīng)的fromfile可以還原這些信息。


np.fromfile(frame,dtype=float,count=-1,sep='')


  • frame:文件

  • dtype:讀取元素使用的數(shù)據(jù)類型,默認(rèn)為float

  • count:讀文件的個數(shù),默認(rèn)-1,讀取全部

  • sep:數(shù)據(jù)分割字符串,如果是空串,寫入文件為二進制。


如果我們想要重新恢復(fù)數(shù)據(jù)的維度信息,我們需要重新使用reshape來恢復(fù)維度信息:


c = np.fromfile('b.dat',sep=',',dtype=np.int).reshape(5,10,2)


不得不說,當(dāng)我看到這個方法時感覺這兩個真是蠢爆了,使用savetxt / loadtxt 至少還能保存?zhèn)€二維信息,而使用了tofile / fromfile 方法居然把數(shù)被伸展為一維的,然后自己記住維度信息(╯‵□′)╯︵┻━┻。


因此,為了保存更復(fù)雜的數(shù)據(jù)類型,二維以上的數(shù)據(jù)信息,save / load 函數(shù)成功解決了這個問題:(為了方便,兩個函數(shù)就放到一起了)


保存 / 讀取高維度數(shù)據(jù)


np.save(frame,array)np.savez(fname,array)(壓縮)

+ frame:文件名,以.npy為擴展名,壓縮擴展名為.npz

+ array:數(shù)組變量

np.load(fname)


Demo:


a = np.arange(100).reshape(5,10,2)

np.save('a.npy',a)

b=np.load('a.npy')


附錄


附錄中提供NP的常用方法及注釋,做查詢用。


np數(shù)組定義


>>>lst = [[1,3,5],[2,4,6]]

>>>np_lst = np.array(lst,dtype=np.float)

>>>print(np_lst.shape)#返回數(shù)組的行列

>>>print(np_lst.ndim)#返回數(shù)組的維數(shù)

>>>print(np_lst.dtype)#返回數(shù)據(jù)類型,float默認(rèn)為64

>>>print(np_lst.itemsize)#np.array每個元素的大小,float64占8個字節(jié)

>>>print(np_lst.size)#大小,6個元素

(2, 3)

2

float64

8

6


初始化數(shù)組


>>>print(np.zeros([2,4])#初始化一個2行4列的數(shù)組

>>>print(np.ones([2,4])

[[ 0.  0.  0.  0.]

[ 0.  0.  0.  0.]]

[[ 1.  1.  1.  1.]

[ 1.  1.  1.  1.]]


隨機序列


>>>print(np.random.rand(2,4))#將生成一個處于0~1之間2行4列的隨機數(shù)序列(不加參數(shù)將只返回一個)

[[ 0.39531286  0.4845      0.1463168   0.82327991]

[ 0.89042255  0.65049931  0.43890163  0.89577744]]


如果想要多個隨機整數(shù):


print(np.random.randint(22,55,3))#必須有(前兩個參數(shù))指定范圍,第三個參數(shù)用于指定生成的個數(shù)

[27 40 29]

print(np.random.randn(2,4))#生成標(biāo)準(zhǔn)正態(tài)隨機數(shù)

[[-1.15561548  0.3689953   0.38253231 -1.16346441]

[-1.32625322 -0.41707673 -0.11822205 -0.95807535]]

print(np.random.choice([10,20,40,33]))#從指定可迭代的數(shù)組中生成隨機數(shù)

20

print(np.random.beta(1,10,4))#生成4個beta分布

[ 0.02258548  0.25848896  0.00696899  0.0609543 ]


多維數(shù)組運算


print(np.arange(1,11,2))#得到step為2的range序列

[1 3 5 7 9]


還可以使用reshape函數(shù),對數(shù)組結(jié)構(gòu)重定義:


print(np.arange(1,11).reshape(2,5))#(5可以缺省為-1)

[[ 1  2  3  4  5]

[ 6  7  8  9 10]]


下面介紹一些常用的運算操作:


lst=np.arange(1,11).reshape(2,5)

print(np.exp(lst))#自然指數(shù)操作

[[  2.71828183e+00   7.38905610e+00   2.00855369e+01   5.45981500e+01    1.48413159e+02]

[  4.03428793e+02   1.09663316e+03   2.98095799e+03   8.10308393e+03    2.20264658e+04]]


此外,還可以sqrt、log、sin、sum、max等操作:


我們下定義一個三維數(shù)組:


lst = np.array([

                [[1,2,3,4],[4,5,6,7]],

                [[7,8,9,10],[10,11,12,13]],

                [[14,15,16,17],[18,19,20,21]]

            ])

print(lst.sum())

252


我們可以看到sum方法對lst的所有元素都進行了求和,此外我們還可以通過對sum方法增加參數(shù)axis的方式來設(shè)置求和的深入維度:


print(lst.sum(axis=0))

[[22 25 28 31]#22=1+7+14;25=2+8+15

[32 35 38 41]]

print(lst.sum(axis=1))

[[ 5  7  9 11]#5=1+4;7=2+5

[17 19 21 23]

[32 34 36 38]]

print(lst.sum(axis=2))

[[10 22]#10=1+2+3+4;22=4+5+6+7

[34 46]

[62 78]]


這里的axis取值為數(shù)組維數(shù)-1,axis可以理解為進行運算操作時的深入程度,axis越大,深入程度越大。同理,不僅sum函數(shù),max等函數(shù)也可以一樣理解。


相加運算


numpy.array是np最簡單的數(shù)據(jù)結(jié)構(gòu)。np.array相比與Python原生列表其強大之處在于可以實現(xiàn)對數(shù)組數(shù)據(jù)的運算。我們知道,list只能對元素的追加。而numpy是真正意義上的數(shù)據(jù)運算。


例如


    In [1]: import numpy as np

    In [2]: list1 = np.array([10,20,30,40])

    In [3]: list2 = np.array([4,3,2,1])

    In [4]: print(list1)

    [10 20 30 40]

    In [5]: print(list1+list2)

    [14 23 32 41]


但np最強大的地方不在于簡單的一維運算,Np對矩陣也能進行基本的運算操作:


lst1 =np.array([10,20,30,40])

lst2 = np.array([4,3,2,1])

print(np.dot(lst1.reshape([2,2]),lst2.reshape([2,2])))

[[10 22]

[34 46]

[62 78]]

[[ 80  50]

[200 130]]


此外,由于原生list沒有確定的數(shù)據(jù)類型,所以維護起來成本較高,而使用C編寫的numpy,則可以聲明各種常見的數(shù)據(jù)類型:


lst = [[1,3,5],[2,4,6]]

np_lst = np.array(lst,dtype=np.float)


np所支持的數(shù)據(jù)類型都有bool、int8/16/32/64/128/、uint8/16/32/64/128、float16/32/43、complex64/128、string。


總結(jié)


Python作為一門弱類型語言,有其不可避免的缺點。但NP的出現(xiàn),彌補了這些缺點,使其具備了構(gòu)造復(fù)雜數(shù)據(jù)類型的能力,為Python數(shù)據(jù)分析提供了基礎(chǔ)。


看完本文有收獲?請轉(zhuǎn)發(fā)分享給更多人

關(guān)注「Python開發(fā)者」,提升Python技能

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
numpy 147
Python基礎(chǔ)數(shù)據(jù)處理庫
Python 學(xué)習(xí)之 Numpy!最神奇的模塊!了解一下?
Python numpy的基本操作你一般人都不會
NumPy學(xué)習(xí)筆記(2)
基礎(chǔ)|Numpy常用知識點匯總
更多類似文章 >>
生活服務(wù)
熱點新聞
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服