Python數據分析 - numpy

前言

NUMPY(如下簡稱NP)是Python數據分析必不可少的第三方庫,np的出現必定程度上解決了Python運算性能不佳的問題,同時提供了更加精確的數據類型。現在,np被Python其它科學計算包做爲基礎包,已成爲Python 數據分析的基礎,能夠說,NP是SciPy、Pandas等數據處理或科學計算庫最基本的函數功能庫。所以,理解np的數據類型對python數據分析十分有幫助。
下面,本文將介紹Np的經常使用操做和基本數據類型。python

NP提供瞭如下重點功能。數組

  • 一個強大的N維數組對象ndarray
  • 廣功能函數
  • 整合C/C++/Fortran代碼的工具
  • 提供了線性代數、傅里葉變換、隨機數生成的相關功能

爲了更加直觀的瞭解Np的強大與做用,咱們先看做用再看方法:數據結構

使用NUMPY操做數據集

在操做數據以前,咱們先來理解什麼是維度:dom

什麼是維度

維度是一組數據的組織形式,不一樣數據維度可能表示不一樣的含義。
一維數據由對等關係的有序或無序數據構成,採用線性方式組織,能夠用數組表示。
通俗來說,函數

1,2,3,4工具

這麼一行數據就能夠稱之爲一維數據,但若是咱們再對其摺疊:性能

1,2,
3,4ui

那麼他就成爲了二維數據,又能夠稱之爲矩陣。excel

什麼是數據集

數據集,顧名思義就是數據的集合,是用以訓練程序的數據集合,通常是二維或者多維數表。
若是咱們想本身手工新建一個數據集,能夠直接新建一個文本文件,只要有恰當的數據,均可以稱之爲數據集:code

城市,環比,同比,定基
北京,100.1,100.2,100.3
上海,111.1,111.2,111.3
南京,133.0,133.3,133.4

好比這樣,咱們就能夠稱上面的文件稱之爲數據集。
咱們還注意到,上面數據是使用逗號做爲分隔符分隔數據的,它簡單描述了數據的內容和含義,並使用半角逗號做爲分隔符。
像這樣,用逗號分隔的數據集就稱之爲CSV(Comma-Separated Value,逗號分隔值)數據集,它是一種常見的文件格式,用來存儲批量的數據。它就像一張excel表,用來存儲簡單結構的數據。
怎麼樣,數據集的概念是否特別簡單呢?

生成數據集

數據集是一個簡單的概念,但每次使用手工的方式去寫畢竟不方便,因此,咱們可使用np的內置函數來生成數據集:

np.savetxt(frame,array,fmt='%.18e",delimiter=None)
  • frame:文件、字符串、或產生器的名字,能夠是.gz,.bz2的壓縮文件
  • arrray:存入文件的NP的數組
  • fmt(format):寫入文件的格式,如%d,%.2f,%.18e(默認,科學計數法保留18位)
  • delemiter:分割字符串,默認是任何空格。

咱們能夠這樣寫下代碼:

a= np.arange(20).reshape(4,5)
np.savetxt('demo.csv',a,fmt='%d',delimiter=',')

這樣,咱們就會在當前的工做目錄下發現一個新的demo.csv,用記事本打開,裏面是一個4 * 5的矩陣,元素0~19。

讀取數據集

既然生成,那就能夠讀取,一樣使用np:

np.loadtxt(frame,dtype=np.float,delimiter=None,inpack=False)
  • frame:指定讀入的文件來源
  • dtype:數據類型,默認爲np.float。
  • delimiter:分割字符串
  • unpack:默認爲False讀入文件寫入一個數組,若是爲True,讀入屬性將分別寫入不一樣變量

一樣的咱們只須要寫下代碼:

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

就能夠查看到咱們先前寫入的數組a。

CSV文件的侷限

能夠發現,CSV文件只能有效存儲和讀取一維和二維數組,由於更高的維度沒法更直觀的文本下顯現出來,這時,更加靈活的存取方式就呼之欲出了,但講以前先賣個關子,再介紹一個不太經常使用的方法:tofile:
對於NP中的ndarray數組,咱們可使用NP中的tofile方法。

a.tofile(frame,sep='',format='%d')
  • frame:文件,字符串
  • 數據分割字符串,若是不寫,將使用二進制文件存儲
  • format:寫入數據的格式

一樣,咱們只須要命令:

import numpy as np
a = np.arange(100).reshape(5,10,2)
a.tofile("a.dat",sep=',',format='%d')

就能夠生成新的CSV數據集。

此時,咱們若是打開a.dat文件,咱們能夠看到數組1,2,3……99。可是與CSV不一樣,這個文件並無包含數字的維度信息,他只是將數組全部元素逐一的列出。並且若是咱們不指定sep,將保存爲二進制文件,雖然對人不可讀,但將佔用更小的空間。

既然tofile能夠保存文本文件,那麼也很容易猜到對應的fromfile能夠還原這些信息。

np.fromfile(frame,dtype=float,count=-1,sep='')
  • frame:文件
  • dtype:讀取元素使用的數據類型,默認爲float
  • count:讀文件的個數,默認-1,讀取所有
  • sep:數據分割字符串,若是是空串,寫入文件爲二進制。

若是咱們想要從新恢復數據的維度信息,咱們須要從新使用reshape來恢復維度信息:

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

不得不說,當我看到這個方法時感受這兩個真是蠢爆了,使用savetxt / loadtxt 至少還能保存個二維信息,而使用了tofile / fromfile 方法竟然把數被伸展爲一維的,而後本身記住維度信息(╯‵□′)╯︵┻━┻。

所以,爲了保存更復雜的數據類型,二維以上的數據信息,save / load 函數成功解決了這個問題:(爲了方便,兩個函數就放到一塊兒了)

保存 / 讀取高維度數據

np.save(frame,array)或np.savez(fname,array)(壓縮)
+ frame:文件名,以.npy爲擴展名,壓縮擴展名爲.npz
+ array:數組變量
np.load(fname)

Demo:

a = np.arange(100).reshape(5,10,2)
np.save("a.npy",a)
b=np.load("a.npy")

附錄

附錄中提供NP的經常使用方法及註釋,作查詢用。

np數組定義

>>>lst = [[1,3,5],[2,4,6]]
>>>np_lst = np.array(lst,dtype=np.float)
>>>print(np_lst.shape)#返回數組的行列
>>>print(np_lst.ndim)#返回數組的維數
>>>print(np_lst.dtype)#返回數據類型,float默認爲64
>>>print(np_lst.itemsize)#np.array每一個元素的大小,float64佔8個字節
>>>print(np_lst.size)#大小,6個元素
(2, 3)
2
float64
8
6

初始化數組

>>>print(np.zeros([2,4])#初始化一個2行4列的數組
>>>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列的隨機數序列(不加參數將只返回一個)
[[ 0.39531286  0.4845      0.1463168   0.82327991]
[ 0.89042255  0.65049931  0.43890163  0.89577744]]

若是想要多個隨機整數:

print(np.random.randint(22,55,3))#必須有(前兩個參數)指定範圍,第三個參數用於指定生成的個數
[27 40 29]
print(np.random.randn(2,4))#生成標準正態隨機數
[[-1.15561548  0.3689953   0.38253231 -1.16346441]
[-1.32625322 -0.41707673 -0.11822205 -0.95807535]]
print(np.random.choice([10,20,40,33]))#從指定可迭代的數組中生成隨機數
20
print(np.random.beta(1,10,4))#生成4個beta分佈
[ 0.02258548  0.25848896  0.00696899  0.0609543 ]

多維數組運算

print(np.arange(1,11,2))#獲得step爲2的range序列
[1 3 5 7 9]

還可使用reshape函數,對數組結構重定義:

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))#天然指數操做
[[  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等操做:
咱們下定義一個三維數組:

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方法增長參數axis的方式來設置求和的深刻維度:

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取值爲數組維數-1,axis能夠理解爲進行運算操做時的深刻程度,axis越大,深刻程度越大。同理,不只sum函數,max等函數也能夠同樣理解。

相加運算

numpy.array是np最簡單的數據結構。np.array相比與Python原生列表其強大之處在於能夠實現對數組數據的運算。咱們知道,list只能對元素的追加。而numpy是真正意義上的數據運算。
例如

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沒有肯定的數據類型,因此維護起來成本較高,而使用C編寫的numpy,則能夠聲明各類常見的數據類型:

lst = [[1,3,5],[2,4,6]]
np_lst = np.array(lst,dtype=np.float)

np所支持的數據類型都有bool、int8/16/32/64/128/、uint8/16/32/64/12八、float16/32/4三、complex64/12八、string。

總結

Python做爲一門弱類型語言,有其不可避免的缺點。但NP的出現,彌補了這些缺點,使其具有了構造複雜數據類型的能力,爲Python數據分析提供了基礎。

相關文章
相關標籤/搜索