本人小白一枚,最近在精讀《利用Python進行數據分析》雖然書中的代碼實現是python2版本的,但準備手工把其中的代碼用Python3敲一遍,但願能夠儘快讀完。python
Numpy簡介數組
Numpy(Numerical Python的簡稱)是高性能科學計算和數據分析的基礎包。其部分功能以下:安全
①ndarray,一個具備矢量算術運算和複雜廣播能力的快速且節省空間的多維數組。dom
②用於對整組數據進行快速運算的標準數學函數(無需編寫循環)。ide
③用於讀寫磁盤數據的工具以及用於操做內存映射文件的工具。函數
④線性代數、隨機數生成以及傅里葉變換功能。工具
⑤用於集成由C、C++、Fortran等語言編寫的代碼的工具。性能
每一個數組都有一個shape(一個表示各維度大小的元組)和一個dtype(一個用於說明數組數據類型的對象)測試
import numpy as np data1 = [6,7.5,8,0,1] #建立列表 arr1 = np.array(data1) #轉換爲數組 print(arr1) print(arr1.dtype) #數據類型保存在dtype對象中 data2 = [[1,2,3,4],[5,6,7,8]] #建立嵌套序列(由等長列表組成的列表) arr2 = np.array(data2) #轉換爲多維數組 print(arr2) print(arr1.dtype) print(arr1.shape)
除np.array以外,還有一些函數也能夠新建數組。好比,zeros和ones分別能夠建立指定長度或形狀的全0或全1數組。empty能夠建立一個沒有任何具體值的數組。要用這些方法建立多維數組,只需傳入一個表示形狀的元組便可:大數據
print(np.zeros(10)) #建立指定長度(10)的全0數組 print(np.ones(2,4)) #建立指定長度的(2行4列二維)的全1數組 print(np.empty((2, 3, 2)))
第一個參數表示數組的維度
注意:認爲np.empty會返回全0數組的想法是不安全的。不少狀況下(如前所示),它返回的都是一些未初始化的垃圾值。arange是Python內置函數range的數組版:
range(10) #建立指定數量的順序列表(內置函數,默認0開始) print(np.arange(15)) #建立指定數量的順序數組 arr1=np.array([1,2,3],dtype=np.float64) #建立特定數據類型的數組
數組建立函數:
dtype(數據類型)是一個特殊的對象,它含有ndarray將一塊內存解釋爲特定數據類型所需的信息。
dtype是NumPy如此強大和靈活的緣由之一。多數狀況下,它們直接映射到相應的機器表示,這使得「讀寫磁盤上的二進制數據流」以及「集成低級語言代碼(如C、Fortran)」等工做變得更加簡單。數值型dtype的命名方式相同:一個類型名(如float或int),後面跟一個用於表示各元素位長的數字。標準的雙精度浮點值(即Python中的float對象)須要佔用8字節(即64位)。所以,該類型在NumPy中就記做float64。下圖列示了NumPy所支持的所有數據類型。
注意:記不住這些NumPy的dtype也不要緊,新手更是如此。一般只須要知道你所處理的數據的大體類型是浮點數、複數、整數、布爾值、字符串,仍是普通的Python對象便可。當你須要控制數據在內存和磁盤中的存儲方式時(尤爲是對大數據集),那就得了解如何控制存儲類型。
轉換數據類型
能夠經過ndarray的astype方法顯式地轉換其dtype。
arr = np.array([1,2,3,4,5]) print(arr.dtype) float_arr = arr.astype(np.float32) print(float_arr.dtype)
注意:浮點數(好比float64和float32)只能表示近似的分數值。在複雜計算中,因爲可能會積累一些浮點錯誤,所以比較操做只能在必定小數位之內有效。
三、數組和標量之間的運算
數組很重要,由於它使你不用編寫循環便可對數據執行批量運算。這一般就叫作矢量化(vectorization)。大小相等的數組之間的任何算術運算都會將運算應用到元素級。
arr=np.array([[1.,2.,3.],[4.,5.,6.]]) #建立二維數組 arr*arr #行列號相同的數組元素間運算 arr-arr 1/arr arr*0.5
四、基本的索引和切片
從表面上看,它們跟Python列表的功能差很少,跟列表最重要的區別在於,數組切片是原始數組的視圖。這意味着數據不會被複制,視圖上的任何修改都會直接反映到源數組上:
arr=np.arange(10) arr[5] #索引第6個元素 arr[5:8] #索引第6到第9個元素做爲數組 arr[5:8]=12 #令第6到第9個元素等於12 arr_slice=arr[5:8] #數組切片是原始數據的視圖,視圖上的任何修改都會反映到原數組 arr_slice[:]=64 #將數組切片的所有元素改成64 arr[5:8].copy() #獲得數組切片的一份副本 arr2d=np.array([[1,2,3],[4,5,6],[7,8,9]]) arr2d[2] #索引二維數組第3行 arr2d[0][2] arr2d[0,2] #等價索引1行3列元素 arr2d[:2] #索引第1行和第2行(不含第3行) arr2d[:,:1] #索引第1列 arr2d[:-2] #使用負數索引將從尾部開始選取行
二維數組的索引方式
五、切片索引
ndarray的切片語法跟Python列表這樣的一維對象差很少
能夠一次性傳入多個切片,就像傳入多個索引那樣。
六、布爾型索引
names = np.array(['Bob','Joe','Will','Bob','Will','Joe','Joe']) names =='Bob' #array([ True, False, False, True, False, False, False], dtype=bool) data = np.random.randn(7,4) data[names=='Bob'] data[names=='Bob',2:] #布爾型數組的長度必須跟被索引的軸長度一致 names !='Bob' #不等於 data[-(names=='Bob')] #負號(-)對條件進行否認 #Python關鍵字and和or在布爾型數組中無效。
經過布爾型數組設置值是一種常常用到的手段。爲了將data中的全部負值都設置爲0,咱們能夠這樣:
data[data < 0] = 0
七、花式索引
指的是利用整數數組進行索引,以特定的順序選取子行。
arr = np.empty((8,4)) for i in range(8): arr[i] = i arr[[2,3,0]] #以特定順序選取行子集,傳入整數列表或ndarray
若是想要選出的是矩形區域,有兩種方法,一種是data[[1,3]][:,[1,3]],至關於先在軸0作一次索引,而後再在軸1作一次索引。另外一種是用np.ix_函數將兩個一維數組轉化成選取矩形的索引器:data[np.ix_([1,3],[1,3])]。
用np.ix_函數,它能夠將兩個一維整數數組轉換爲一個用於選取方形區域的索引器。
八、數組轉置和軸對換
轉置(transpose)是重塑的一種特殊形式,它返回的是源數據的視圖(不會進行任何複製操做)。數組不只有transpose方法,還有一個特殊的T屬性。
通用函數(即ufunc)是一種對ndarray中的數據執行元素級運算的函數。你能夠將其看作簡單函數(接受一個或多個標量值,併產生一個或多個標量值)的矢量化包裝器。
import numpy as np arr=np.arange(10) np.sqrt(arr) #計算各元素的平方根(arr**0.5) exp #計算各元素指數ex; abs #絕對值; np.add(x,y) #x、y數組中對應元素相加; subtract #相減; multiply #相乘; divide #相除;
一、利用數組進行數據處理
用數組表達式代替循環的作法,一般被稱爲矢量化。
import numpy as np points = np.arange(-5, 5, 0.01) xs, ys = np.meshgrid(points,points) z = np.sqrt(xs **2 + ys **2) print(z)
二、將條件邏輯表述爲數組運算
numpy.where函數是三元表達式x if condition else y的矢量化版本。
如:
import numpy as np xarr = np.array([1.1,1.2,1.3,1.4,1.5]) yarr = np.array([2.1,2.2,2.3,2.4,2.5]) cond = np.array([True,False,True,True,False])
假設咱們想要根據cond中的值選取xarr和yarr的值:當cond中的值爲True時,選取xarr的值,不然從yarr中選取。列表推導式的寫法應該以下所示:
使用np.where
import numpy as np xarr=np.array([1.1,1.2,1.3,1.4,1.5]) #兩個數值數組 yarr=np.array([2.1,2.2,2.3,2.4,2.5]) cond=np.array([True,False,True,True,False]) #一個布爾數組 result=np.where(cond,xarr,yarr) #三元表達式
三、數學和統計方法
能夠經過數組上的一組數學函數對整個數組或某個軸向的數據進行統計計算。sum、mean以及標準差std等聚合計算(aggregation,一般叫作約簡(reduction))既能夠當作數組的實例方法調用,也能夠當作頂級NumPy函數使用:
arr=np.random.randn(5,4) arr.mean(); np.mean(arr); arr.sum(); arr.mean(axis=1) #計算該軸上的統計值(0爲列,1爲行)
四、用於布爾型數組的方法
布爾值會被強制轉換爲1(True)和0(False)。所以,sum常常被用來對布爾型數組中的True值計數:
arr=randn(100) (arr>0).sum() #正值的數量 bools.any() #用於測試數組中是否存在一個或多個True bools.all() #用於測試數組中全部值是否都是True
五、排序
跟Python內置的列表類型同樣,NumPy數組也能夠經過sort方法就地排序:
arr=randn(8) arr.sort() arr=randn(5,3) arr.sort(0) #二維數組按列排序; arr.sort(1) #二維數組按行排序
六、惟一化
ints=np.array([3,3,3,2,2,1,1,4,4]) np.unique(names) #找出數組中的惟一值並返回已排序的結果
七、用於數組的文件輸入輸出
Numpy可以讀寫磁盤上的文本數據或二進制數據。
arr=np.arange(10) np.save('some_array',arr) #數組以未壓縮的原始二進制格式保存在.npy文件中 np.load('some_array') #經過np.load讀取磁盤上的數組 np.savez('array_archive.npz',a=arr,b=arr) #將多個數組以保存在一個壓縮文件中 a=np.arange(0,12,0.5).reshape(4,-1) np.savetxt(r'E:\\knakan\\a.txt',a) #缺省按照’%.18e’格式保存數據,以空格分隔 np.loadtxt(r'E:\\kankan\\a.txt') np.savetxt(r'\kankan\\a.txt',a,fmt="%d"delimiter=",") #改成保存爲整數,以逗號分隔 np.loadtxt(r'E:\\kankan\\a.txt',delimiter=",") #讀入時也需指定逗號分隔
八、 線性代數
x=np.array([[1.,2.,3.],[4.,5.,6.]]) y=np.array([[6.,23.],[-1,7],[8,9]]) x.dot(y) #矩陣乘法,至關於np.dot(x,y)