摘要:前言以下簡(jiǎn)稱是數(shù)據(jù)分析必不可少的第三方庫,的出現(xiàn)一定程度上解決了運(yùn)算性能不佳的問題,同時(shí)提供了更加精確的數(shù)據(jù)類型。因此,理解的數(shù)據(jù)類型對(duì)數(shù)據(jù)分析十分有幫助。一維數(shù)據(jù)由對(duì)等關(guān)系的有序或無序數(shù)據(jù)構(gòu)成,采用線性方式組織,可以用數(shù)組表示。
前言
NUMPY(以下簡(jiǎn)稱NP)是Python數(shù)據(jù)分析必不可少的第三方庫,np的出現(xiàn)一定程度上解決了Python運(yùn)算性能不佳的問題,同時(shí)提供了更加精確的數(shù)據(jù)類型。如今,np被Python其它科學(xué)計(jì)算包作為基礎(chǔ)包,已成為Python 數(shù)據(jù)分析的基礎(chǔ),可以說,NP是SciPy、Pandas等數(shù)據(jù)處理或科學(xué)計(jì)算庫最基本的函數(shù)功能庫。因此,理解np的數(shù)據(jù)類型對(duì)python數(shù)據(jù)分析十分有幫助。
下面,本文將介紹Np的常用操作和基本數(shù)據(jù)類型。
NP提供了以下重點(diǎn)功能。
一個(gè)強(qiáng)大的N維數(shù)組對(duì)象ndarray
廣功能函數(shù)
整合C/C++/Fortran代碼的工具
提供了線性代數(shù)、傅里葉變換、隨機(jī)數(shù)生成的相關(guān)功能
為了更加直觀的了解Np的強(qiáng)大與作用,我們先看作用再看方法:
使用NUMPY操作數(shù)據(jù)集在操作數(shù)據(jù)之前,我們先來理解什么是維度:
什么是維度維度是一組數(shù)據(jù)的組織形式,不同數(shù)據(jù)維度可能表示不同的含義。
一維數(shù)據(jù)由對(duì)等關(guān)系的有序或無序數(shù)據(jù)構(gòu)成,采用線性方式組織,可以用數(shù)組表示。
通俗來講,
1,2,3,4
這么一行數(shù)據(jù)就可以稱之為一維數(shù)據(jù),但如果我們?cè)賹?duì)其折疊:
1,2,
3,4
那么他就成為了二維數(shù)據(jù),又可以稱之為矩陣。
什么是數(shù)據(jù)集數(shù)據(jù)集,顧名思義就是數(shù)據(jù)的集合,是用以訓(xùn)練程序的數(shù)據(jù)集合,一般是二維或者多維數(shù)表。
如果我們想自己手工新建一個(gè)數(shù)據(jù)集,可以直接新建一個(gè)文本文件,只要有恰當(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ù)是使用逗號(hào)作為分隔符分隔數(shù)據(jù)的,它簡(jiǎn)單描述了數(shù)據(jù)的內(nèi)容和含義,并使用半角逗號(hào)作為分隔符。
像這樣,用逗號(hào)分隔的數(shù)據(jù)集就稱之為CSV(Comma-Separated Value,逗號(hào)分隔值)數(shù)據(jù)集,它是一種常見的文件格式,用來存儲(chǔ)批量的數(shù)據(jù)。它就像一張excel表,用來存儲(chǔ)簡(jiǎn)單結(jié)構(gòu)的數(shù)據(jù)。
怎么樣,數(shù)據(jù)集的概念是否特別簡(jiǎn)單呢?
數(shù)據(jù)集是一個(gè)簡(jiǎn)單的概念,但每次使用手工的方式去寫畢竟不方便,所以,我們可以使用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é)計(jì)數(shù)法保留18位)
delemiter:分割字符串,默認(rèn)是任何空格。
我們可以這樣寫下代碼:
a= np.arange(20).reshape(4,5) np.savetxt("demo.csv",a,fmt="%d",delimiter=",")
這樣,我們就會(huì)在當(dāng)前的工作目錄下發(fā)現(xiàn)一個(gè)新的demo.csv,用記事本打開,里面是一個(gè)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讀入文件寫入一個(gè)數(shù)組,如果為True,讀入屬性將分別寫入不同變量
同樣的我們只需要寫下代碼:
np.loadtxt("demo.csv",delimiter=",")
就可以查看到我們先前寫入的數(shù)組a。
CSV文件的局限可以發(fā)現(xiàn),CSV文件只能有效存儲(chǔ)和讀取一維和二維數(shù)組,因?yàn)楦叩木S度無法更直觀的文本下顯現(xiàn)出來,這時(shí),更加靈活的存取方式就呼之欲出了,但講之前先賣個(gè)關(guān)子,再介紹一個(gè)不太常用的方法:tofile:
對(duì)于NP中的ndarray數(shù)組,我們可以使用NP中的tofile方法。
a.tofile(frame,sep="",format="%d")
frame:文件,字符串
數(shù)據(jù)分割字符串,如果不寫,將使用二進(jìn)制文件存儲(chǔ)
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ù)集。
此時(shí),我們?nèi)绻蜷_a.dat文件,我們可以看到數(shù)組1,2,3……99。但是與CSV不同,這個(gè)文件并沒有包含數(shù)字的維度信息,他只是將數(shù)組所有元素逐一的列出。而且如果我們不指定sep,將保存為二進(jìn)制文件,雖然對(duì)人不可讀,但將占用更小的空間。
既然tofile可以保存文本文件,那么也很容易猜到對(duì)應(yīng)的fromfile可以還原這些信息。
np.fromfile(frame,dtype=float,count=-1,sep="")
frame:文件
dtype:讀取元素使用的數(shù)據(jù)類型,默認(rèn)為float
count:讀文件的個(gè)數(shù),默認(rèn)-1,讀取全部
sep:數(shù)據(jù)分割字符串,如果是空串,寫入文件為二進(jìn)制。
如果我們想要重新恢復(fù)數(shù)據(jù)的維度信息,我們需要重新使用reshape來恢復(fù)維度信息:
c = np.fromfile("b.dat",sep=",",dtype=np.int).reshape(5,10,2)
不得不說,當(dāng)我看到這個(gè)方法時(shí)感覺這兩個(gè)真是蠢爆了,使用savetxt / loadtxt 至少還能保存?zhèn)€二維信息,而使用了tofile / fromfile 方法居然把數(shù)被伸展為一維的,然后自己記住維度信息(╯‵□′)╯︵┻━┻。
因此,為了保存更復(fù)雜的數(shù)據(jù)類型,二維以上的數(shù)據(jù)信息,save / load 函數(shù)成功解決了這個(gè)問題:(為了方便,兩個(gè)函數(shù)就放到一起了)
保存 / 讀取高維度數(shù)據(jù)np.save(frame,array)或np.savez(fname,array)(壓縮) + frame:文件名,以.npy為擴(kuò)展名,壓縮擴(kuò)展名為.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)#返回?cái)?shù)組的行列 >>>print(np_lst.ndim)#返回?cái)?shù)組的維數(shù) >>>print(np_lst.dtype)#返回?cái)?shù)據(jù)類型,float默認(rèn)為64 >>>print(np_lst.itemsize)#np.array每個(gè)元素的大小,float64占8個(gè)字節(jié) >>>print(np_lst.size)#大小,6個(gè)元素 (2, 3) 2 float64 8 6初始化數(shù)組
>>>print(np.zeros([2,4])#初始化一個(gè)2行4列的數(shù)組 >>>print(np.ones([2,4]) [[ 0. 0. 0. 0.] [ 0. 0. 0. 0.]] [[ 1. 1. 1. 1.] [ 1. 1. 1. 1.]]隨機(jī)序列
>>>print(np.random.rand(2,4))#將生成一個(gè)處于0~1之間2行4列的隨機(jī)數(shù)序列(不加參數(shù)將只返回一個(gè)) [[ 0.39531286 0.4845 0.1463168 0.82327991] [ 0.89042255 0.65049931 0.43890163 0.89577744]]
如果想要多個(gè)隨機(jī)整數(shù):
print(np.random.randint(22,55,3))#必須有(前兩個(gè)參數(shù))指定范圍,第三個(gè)參數(shù)用于指定生成的個(gè)數(shù) [27 40 29] print(np.random.randn(2,4))#生成標(biāo)準(zhǔn)正態(tài)隨機(jī)數(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ù)組中生成隨機(jī)數(shù) 20 print(np.random.beta(1,10,4))#生成4個(gè)beta分布 [ 0.02258548 0.25848896 0.00696899 0.0609543 ]多維數(shù)組運(yùn)算
print(np.arange(1,11,2))#得到step為2的range序列 [1 3 5 7 9]
還可以使用reshape函數(shù),對(duì)數(shù)組結(jié)構(gòu)重定義:
print(np.arange(1,11).reshape(2,5))#(5可以缺省為-1) [[ 1 2 3 4 5] [ 6 7 8 9 10]]
下面介紹一些常用的運(yùn)算操作:
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等操作:
我們下定義一個(gè)三維數(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方法對(duì)lst的所有元素都進(jìn)行了求和,此外我們還可以通過對(duì)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可以理解為進(jìn)行運(yùn)算操作時(shí)的深入程度,axis越大,深入程度越大。同理,不僅sum函數(shù),max等函數(shù)也可以一樣理解。
相加運(yùn)算numpy.array是np最簡(jiǎn)單的數(shù)據(jù)結(jié)構(gòu)。np.array相比與Python原生列表其強(qiáng)大之處在于可以實(shí)現(xiàn)對(duì)數(shù)組數(shù)據(jù)的運(yùn)算。我們知道,list只能對(duì)元素的追加。而numpy是真正意義上的數(shù)據(jù)運(yùn)算。
例如
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最強(qiáng)大的地方不在于簡(jiǎn)單的一維運(yùn)算,Np對(duì)矩陣也能進(jìn)行基本的運(yùn)算操作:
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ù)類型,所以維護(hù)起來成本較高,而使用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作為一門弱類型語言,有其不可避免的缺點(diǎn)。但NP的出現(xiàn),彌補(bǔ)了這些缺點(diǎn),使其具備了構(gòu)造復(fù)雜數(shù)據(jù)類型的能力,為Python數(shù)據(jù)分析提供了基礎(chǔ)。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/40884.html
摘要:下文統(tǒng)一稱為數(shù)組是存儲(chǔ)單一數(shù)據(jù)類型的多維數(shù)組同語言數(shù)組直接保存數(shù)值而則是能夠?qū)?shù)組進(jìn)行處理的函數(shù)。動(dòng)態(tài)數(shù)據(jù)類型與的數(shù)組和的這些不可變數(shù)據(jù)類型的適用場(chǎng)景等可變數(shù)據(jù)類型適用于需要不斷對(duì)原始數(shù)據(jù)進(jìn)行修改的場(chǎng)景。 showImg(https://segmentfault.com/img/remote/1460000018925396);Numpy,是python中的一個(gè)矩陣計(jì)算包,功能類似ma...
摘要:包的核心是對(duì)象。但有個(gè)例外,包括對(duì)象數(shù)組的元素大小是不同的。序列大小和速度在科學(xué)計(jì)算中尤為重要。例如考慮兩個(gè)長(zhǎng)度相同的列表中每個(gè)元素相乘的情況。此外,編碼所需的工作量隨數(shù)據(jù)維數(shù)的增加而增加。這些信息主要用于高級(jí)用戶。 譯者:飛龍 1.1 NumPy 是什么? 原文:What is NumPy? NumPy是Python中用于科學(xué)計(jì)算的基礎(chǔ)包。它是一個(gè)Python庫,提供多維數(shù)組對(duì)象,各...
摘要:本章學(xué)習(xí)兩個(gè)科學(xué)運(yùn)算當(dāng)中最為重要的兩個(gè)模塊,一個(gè)是一個(gè)是。這種工具可用來存儲(chǔ)和處理大型矩陣,比自身的嵌套列表結(jié)構(gòu)要高效的多該結(jié)構(gòu)也可以用來表示矩陣。專為進(jìn)行嚴(yán)格的數(shù)字處理而產(chǎn)生??梢酝ㄟ^函數(shù)對(duì)相應(yīng)值進(jìn)行打印檢驗(yàn)。 本章學(xué)習(xí)兩個(gè)科學(xué)運(yùn)算當(dāng)中最為重要的兩個(gè)模塊,一個(gè)是 numpy,一個(gè)是 pandas。任何關(guān)于數(shù)據(jù)分析的模塊都少不了它們兩個(gè)。 一、numpy & pandas特點(diǎn) NumP...
小編寫這篇文章的主要目的,主要是給大家進(jìn)行介紹,關(guān)于NumPy與Python內(nèi)置列表計(jì)算標(biāo)準(zhǔn)差區(qū)別的相關(guān)介紹,希望可以給各位讀者帶來幫助。 1什么是Numpy NumPy,是NumericalPython的通稱,用以性能卓越計(jì)算機(jī)的應(yīng)用和數(shù)據(jù)統(tǒng)計(jì)分析的前提包,像數(shù)理科學(xué)專用工具(pandas)和架構(gòu)(Scikit-learn)中都采用上了NumPy這個(gè)包?! umPy中的基本數(shù)據(jù)結(jié)構(gòu)是n...
摘要:中的和中的矩陣分析由于之前在做的源碼學(xué)習(xí),并且將其的源碼翻譯成了的版本。在逛知乎里,我又發(fā)現(xiàn)了很多關(guān)于為什么這么快的討論,很有意思。作者鏈接來源知乎著作權(quán)歸作者所有。 python中的list和numpy中的矩陣分析 Author : Jasper Yang School : Bupt preface 由于之前在做GIbbsLDA++的源碼學(xué)習(xí),并且將其c++的源碼翻譯成了pyth...
摘要:前言對(duì)的意義非凡,在數(shù)據(jù)分析與機(jī)器學(xué)習(xí)領(lǐng)域?yàn)榱⑾铝撕柜R功勞?,F(xiàn)在用搞數(shù)據(jù)分析或機(jī)器學(xué)習(xí)經(jīng)常使用的等庫,都需要基于構(gòu)建。毫不夸張地說,沒有,今天在數(shù)據(jù)分析與機(jī)器學(xué)習(xí)領(lǐng)域只能是捉襟見肘。 前言 numpy對(duì)python的意義非凡,在數(shù)據(jù)分析與機(jī)器學(xué)習(xí)領(lǐng)域?yàn)閜ython立下了汗馬功勞。現(xiàn)在用python搞數(shù)據(jù)分析或機(jī)器學(xué)習(xí)經(jīng)常使用的pandas、matplotlib、sklearn等庫,都需...
閱讀 971·2021-09-26 09:55
閱讀 3239·2021-09-22 15:36
閱讀 3016·2021-09-04 16:48
閱讀 3183·2021-09-01 11:41
閱讀 2620·2019-08-30 13:49
閱讀 1517·2019-08-29 18:46
閱讀 3573·2019-08-29 17:28
閱讀 3467·2019-08-29 14:11