簡單利用Python進行數據分析(NumPy基礎:數組與向量化計算)

  NumPy基礎:數組與向量化計算

  安裝numpy及使用

  pip install numpy

  PyCharm無法使用numpy

  File-->setting-->項目名-->Project Interpreter-->本地安裝python-->應用

  測試代碼

  import numpy as npdata = np.random.randn(2,3)print(data)

  numpy簡介

  作用

  ndarry,一種高效多維數組,提供了基於數組的邊界算術操作及靈活的廣播功能

  對所有數據進行快速的矩陣計算,而無需編寫循環程序

  對硬盤中數組數據進行讀寫的工具,並對內存映射文件進行操作

  線性代數、隨機數生成以及傅里葉變換功能

  用於連接NumPy到C、C++和FORTRAN語言類庫的C語言API

  數據分析應用

  在數據處理。清洗、構造子集、過濾、變換以及其他計算中進行快速的向量化計算。

  常見的數組算法,比如sort、unique以及set操作等

  高效的描述性統計和聚合/概述數據

  數據排列和相關數據操作,例如對異構數據進行merge和join

  使用數組表達式來表明條件邏輯,代替if-elif-else條件分支的循環

  分組數據操作(聚合、變換以及函數式操作)

  python數組計算曆程

  Python中的數組計算方式要追溯到1995年,當時Jim Hugunin創造Numeric庫。之後10年裏,許多科研編制社區開始利用Python進行數組編程,但類庫的生態在2000年之後都是碎片化的。2005年,Travis Oliphant在Numeric和Numarray項目之上打造了NumPy,將社區整合到用一個數組計算框架下。

  NumPy重要原因

  NumPy在內部將數據存儲在連續的內存塊上,這與其他的Python內建數據結構是不同的。NumPy的算法庫是用C語言寫的,所以在操作數據內存時不需要任何類型檢查或者其他管理操作。NumPy數組使用的內存量也小於其他Pyhon內建序列。

  Numpy可以針對全量數組進行復雜計算而不需要寫Python循環。

  性能對比代碼

  # NumPy性能和Python常規對比start = time.time()my_arr = np.arange(1000000)my_arr = my_arr * 2end = time.time()print('Running time: %s Seconds'%(end-start))start = time.time()my_list = list(range(1000000))my_list = my_list * 2end = time.time()print('Running time: %s Seconds' % (end - start))

  NumPy ndarray:多維數組對象

  ndarray

  NumPy的核心特徵之一就是N-維數組對象--ndarray。ndarray是Python中一個快速、靈活的大型數據集容器。數組允許你使用類似於標量的操作語法在整塊數據上進行數學計算。

  一個ndarray是一個通用的多維同類數據容器,也就是說,他包含的每一個元素均爲相同類型。每一個數組都有一個shape屬性,用來表徵數組每一維度的數量;每一個數組都有一個dtype屬性,用來描述數組的數據類型。

  生成ndarray

  生成數組最簡單的方式就是使用array函數。array函數接收任意的序列型對象(當然也包括其他的數組),生成一個新的包含傳遞數據的NumPy數組。

  屬性

  ndim 數組緯度

  shape 數組緯度和數量

  dtype 數組類型

  數組生成函數

  array 將輸入數據(可以是列表、元組、數組以及其他序列)轉換爲ndarray,如不顯式指明數據類型,將自動判斷;默認複製所有的輸入數據。

  asarray 將輸入轉換爲ndarray,但如果輸入已經是ndarray則不再複製

  arange Python內建函數range的數組版,返回一個數組

  ones 根據給定形狀和數據類型生成全1數組

  ones_like 根據所誒數組生成一個形狀一樣的全1數組

  zeros 根據給定形狀和數據類型生成全0數組

  zeros_like 根據所給的數組生成一個形狀一樣的全0數組

  empty 根據給定形狀生成一個沒有初始化數值的空數組

  empty_like 根據所給數組生成一個形狀一樣但沒有初始化數值的空數組

  full 根據給定的形狀和數據類型生成指定數值的數組

  full_like 根據所給的數組生成一個形狀一樣但內容是指定數值的數組

  eye,identity 生成一個N*N特徵矩陣(對角線位置都是1,其餘位置都是0)

  使用np.empty 來生成一個全0數組,並不安全,有些時候他可能會返回未初始化的垃圾數值

  ndarray數據類型

  數據類型即dtype,是一個特殊的對象,他包含了ndarray需要爲某一種類型數據所申明的內存塊信息(也稱爲元數據,即表示數據的數據)

  通常不需要擔心如何記住NumPy數據類型,尤其當你還是新手的時候。通常你只需要關係數據的大類,比如浮點型、整數、布爾值、字符串或者某個Python對象。當你需要在內存或者硬盤上做更深入的存取操作時,尤其大數據集時,你才真正需要了解存儲的數據類型。

  數據類型

  int8,uint8 類型代碼il,ul 有符號和無符號的8數位整數

  int16,uint16 類型代碼i2,u2 有符號和無符號的16數位整數

  int32,uint32 類型代碼i4,u4 有符號和無符號的32數位整數

  int64,uint64 類型代碼i8,u8 有符號和無符號的64數位整數

  float16 類型代碼f2 半精度浮點數

  float32 類型代碼f4或f 標準單精度浮點數;兼容C語言float

  float64 類型代碼f8或d 標準雙精度浮點數;兼容C語言double和Python float

  float128 類型代碼f16或g 拓展精度浮點數

  complex64,complex128,complex256 類型代碼c8,c16,c32 分別基於32位、64位、128位浮點數的複數

  bool 類型代碼? 布爾值,存儲True或False

  object 類型代碼O Python object類型

  string_ 類型代碼S 修正的ASC II 字符串類型;例如生成一個長度爲10的字符串類型使用S10

  unicode_ 類型代碼U 修改的Unicode類型,生成一個長度爲10的Unicode類型使用U10

  浮點數轉換成整數則小數點後的部分將被消除

  在NumPy中,當使用numpy.string_類型作字符串數據要小心,因爲NumPy會修正他的大小或者刪除輸入切不發出警告。pandas在處理非數值數據時有更直觀的開廂型操作

  使用astype時總生成一個新的數組,即使你傳入的dtype與之前一樣

  NumPy數組算術

  數組之所以重要是因爲他允許你進行批量操作而無需任何for循環,NumPy用戶稱這種特性爲向量化

  帶有標量計算的算術操作,會把計算參數傳遞給數組的每個元素

  同尺寸數組之間的比較,會產生一個布爾值數組

  不同尺寸的數組間的操作,將會用到廣播特性,將會在附錄A中介紹。

  基礎索引與切片

  數組切片是原數組的視圖,意味着數據並不是被複制了任何對於視圖的修改都會反應在原數組上

  如果你還是想要一份數組切片的拷貝而不是一份視圖的話,你就必須顯式地複製這個數組。arr[5:8].copy()

  在一個二維數組中,每個索引值對應的元素不是一個值而是一個一維數組。

  在多維數組中,你可以省略後續索引值,返回對象將是降低一個維度的數組

  數組切片索引

  數組延着軸0進行切片,表達式arr[:2]的含義爲選擇arr的前兩行

  如果將索引和切片混合,就可以得到維度的切片

  注意:單獨一個冒號標識選擇整個軸上的數組

  arr[:2, 1:] 從開始到第二行,從第一列到最後一列

  arr[2] 第三行數據

  arr[2,:] 第三行數據

  arr[2:,:] 第三行數據

  arr[:,:2] 所有行數據和首列到第二列

  布爾索引

  布爾值數組的長度和數組軸索引長度一致。你甚至還可以用切片或者整數值對布爾值數組進行混合匹配

  當布爾值數組的長度不正確時,布爾值選擇數據的方法並不會報錯,因此建議在使用該特性要注意

  爲了選擇除條件以外的其他數據,你可以使用!=或者在條件表達式前使用~對條件取反

  使用布爾值索引選擇數據時,總是生成數據的拷貝,即使返回的數組並沒有任何變化。

  Python中的關鍵字and或or對布爾值數據並沒有用,要使用&(and)和|(or)來代替

  神奇索引

  神奇索引時NumPy中的術語,用於描述使用整數數組進行數據索引。

  神奇搜索與切片不同,他總是將數據複製到一個新的數組中。

  正數數組從前索引,負數數組從後索引

  數組轉置和換軸

  轉置是一種特殊的數據重組形式,可以返回底層數據的視圖而不需要複製任何內容。數組擁有transpose方法,也有特殊的T屬性。

  T屬性就是數據反轉

  計算矩陣內積會使用np.dot

  對於更高維度數組,transpose方法可以接收包含軸編號的元組,用於置換軸。

  使用.T進行轉置是換軸的一個特殊案例,ndarray有一個swapaxes方法,該方法接收一個對軸編號作爲參數,並對軸進行調整用於重組數據

  swapaxes返回的是數據視圖,而沒有對數據進行復制

  通用函數:快速的逐元素數組函數

  含義

  通用函數,也可以稱爲ufunc,是一種ndarray數據中進行逐元素操作的函數。

  某些簡單函數接收一個或者多個標量數值,併產生一個或者多個標量結果,而通過函數就是對這些簡單函數的向量化封裝

  一元通用函數

  abs、fabs 逐元素地計算整數、浮點數或者複數的絕對值

  sqrt 計算每個元素的平方根(與arr ** 0.5相等)

  square 計算每個元素的平方(與arr ** 2相等)

  exp 計算每個元素的自然數指數值ex

  log、log10、log2、log1p 分別對應:自然數對數(e爲底)、對數10位底、對數2爲底、log(1+x)

  sign 計算每個元素的符號值:1(整數)、0(0)、-1(負數)

  ceil 計算每個元素的最高整數值(即大於等於給定數值的最小整數)

  floor 計算每個元素的最小整數值(即小於等於給定元素的最大整數)

  rint 將元素保留整數位,並保持dtype

  modf 分別將數組的小數部分和整數部分按數組形式返回

  isnan 返回數組中的元素是否是一個NaN(不是一個數值),形式爲布爾值數組

  isfinite、isinf 分別返回數組中的元素是否有限(非inf、非NaN)、是否無線的,形式爲布爾值數組

  cos、cosh、sin、sinh、tan、tanh 常規的雙曲三角函數

  arccos、arccosh、arcsin、arcsinh、arctan、arctanh 反三角函數

  logical_not 對數組的元素按位取反(與~arr效果一致)

  二元通用函數

  add 將數組的對應元素相加

  subtract 在第二個數組中,將第一個數組中包含的元素去除

  multiply 將數組的對應元素相乘

  divide、floor_divide 除或者整除(放棄餘數)

  power 將第二個數組的元素作爲第一個數組對應元素的冪次方

  maximum、fmax 逐個元素計算最大值,fmax忽略NaN

  minmum、fmin 逐個元素計算最小值,fmin忽略NaN

  mod 按元素的求摸計算(即求除法的餘數)

  copysign 將第一個數組的符號值改爲第二個數組的符號值

  greater、greater_equal、less、less_equal、equal、not_equal 進行逐個元素的比較,返回布爾值數組(與數學操作符>、>=、<、<=、==、!=效果一致)

  logical_and、logical_or、logical_xor 進行逐個元素的邏輯操作(與邏輯操作符&、|、^效果一致)

  使用數組進行面向數組編程

  含義

  使用NumPy數組可以使你利用簡單的數組表達式完成多種數據操作任務,而無需寫些大量循環。這種利用數組表達式來替代顯式循環的方法稱爲向量化

  向量化的數組操作會比純Python的等價實現在速度上快一到兩個數量級(甚至更多),這對多有種類的數值計算產生了最大的影響

  將條件邏輯作爲數組操作

  numpy.where函數是三元表達式 x if condition else y的向量化版本

  np.where 的第一個參數是條件,第二個和第三個參數並不一定是數組可以是標量

  where在數據分析中一個典型的用法是根據一個數組來生成一個新的數組

  傳遞給np.where的數組即可以是同等大小的數組,也可以是標量

  數學和統計方法

  許多關於計算整個數組統計值或者關於軸向數據的數學函數,可以作爲數組類型的方法被調用。你可以使用聚合函數(通常也叫縮減函數),比如sum、mean和std(標準差),即可以直接調用數組實例的方法,也可以使用頂層的NumPy函數。

  基礎數組統計方法

  sum 沿着軸向計算所有元素的累和,0長度的數組,累和爲0

  mean 數學平均,0長度的數組平均值爲NaN

  std、var 標準差和方差,可以選擇自由度調整(默認分母n)

  min、max 最小值和最大值

  armin、armax 最小值和最大值的位置

  cumsum 從0開始元素累積和

  cumprod 從1開始元素累積積

  布爾值數組的方法

  布爾值會被強制爲1(True)和0(False)。

  可以通過sum用於計算布爾值數組中True的個數

  any檢查數組中是否至少有一個True

  all檢查是否每個值都是True

  排序鄭州人流醫院 http://m.zzzy120.com/

  和Python的內建列表類型相似,NumPy數組可以使用sort方法按位置排序。

  在多維數組中根據傳遞的axis值,沿着軸向對每個一維數據段進行排序

  頂層的np.sort方法返回的是已經排序號的數組拷貝,而不是對原數組按位置排序

  唯一值與其他集合邏輯

  NumPy包含一些針對一維ndarray的基礎集合操作。

  數組集合操作

  unique(x) 計算x的唯一值並排序

  intersect1d(x,y) 計算x和y的交集,並排序

  union1d(x,y) 計算x和y的並集,並排序

  inld(x,y) 計算x中的元素是否包含在y中,返回一個布爾值數組

  setdiff1d(x,y) 差集,在x中但不在y中的x元素

  setxor1d(x,y) 異或集,在x或y中,但不屬於x、y交集的元素

  使用數組進行文件輸入和輸出

  NumPy可以在硬盤中將數據以文本或者二進制文件的形式進行存入銀盤或者由硬盤載入。

  大部分用戶更傾向於與使用pandas或者其他工具來載入文本或者表格型數據

  np.save和np.load是高效存取硬盤數據的兩大工具函數。數組在默認情況下是以未壓縮的格式進行存儲的,後綴名.npy

  壓縮好的數據可能會想要使用numpy.savez_compressed將數據存入已經壓縮的文件中

  線性代數

  線性代數比如矩陣乘法、分解、行列式等方陣數學,是所有數組類庫的重要組成部分

  NumPy的線性代數中所不同的是 * 是矩陣的逐元素乘積而不是矩陣的點乘積,因此NumPy的數組方法和numpy命名空間中都有一個函數dot

  numpy.linalg 擁有一個矩陣分解標準的函數集,以及其他常用函數。

  數組.T.dot(數組) 計算的是數組和它的轉置矩陣數組.T的點乘積

  特殊符號@也作爲中綴操作符,用於點乘矩陣操作

  常用numpy.linalg函數

  diag 講一個方陣的對角(或非對角)元素作爲一維數組返回,或者將一維數組換成一個方陣,並且在非對角線上又零點

  dot 矩陣點乘

  trace 計算對角元素和

  eig 計算方陣的特徵值和特徵向量

  inv 計算方陣的逆矩陣

  pinv 計算矩陣的Moore-Penrose僞逆

  qr 計算QR分解

  svd 計算奇異值分解(SVD)

  solve 求解x的線性系統Ax = b ,其中A是方陣

  lstsq 計算Ax = b 的最小二乘解

  僞隨機數生成

  numpy.random模塊填補了Python內建在random模塊的不足,可以高效地生成多種概率分佈下的完整樣本值數組

  Python內建random模塊一次中能生成一個值

  僞隨機數他們是由具有確定性行爲的算法根據隨機數生成器中的隨機數種子生成,可以通過np.random.seed更改NumPy的隨機數種子

  numpy.random中的數據生成函數使用一個全局隨機數種子。爲了避免全局狀態,你可以使用numpy.random.RandomState創建一個隨機數生成器,使數據獨立於其他的隨機數狀態

  numpy.random中的部分函數

  seed 向隨機數生成器傳遞隨機狀態種子

  permutation 返回一個序列的隨機排列,或者返回一個亂序的整數範圍序列

  shuffle 隨機排列一個序列

  rand 從均勻分佈中抽取樣本

  randint 根據給定的由低到高的範圍抽取隨機整數

  randn 從均值0方差1的正態分佈中抽取樣本(MATLAB型接口)

  binomial 從二項分佈中抽取樣本

  normal 從正態(高斯)分佈中抽取樣本

  beta 從beta分佈中抽取樣本

  chisquare 從卡方分佈中抽取樣本

  gamma 從伽馬分佈中抽取樣本

  uniform 從均勻[0,1)分佈中抽取樣本

  示例:隨機漫步

  隨機漫步模型提供了一個適用數組操作的說明性應用

  一次性模擬多次隨機漫步

  # 模擬多次隨機漫步,比如說5000步,如果傳入一個2個元素的元組# numpy.random中的函數可以生成一個二維抽取數組,並且我們可# 以一次性地跨行計算出全部5000個隨機不的累積和n = 5000ns = 1000d = np.random.randint(0,2,size=(n,ns))s = np.where( d > 0,1,-1)w = s.cumsum(1)print(w)# 現在我們可以計算出這些隨機步的最大值和最小值print(w.max())print(w.min())# 讓我們在這些隨機步中計算出30或者-30的最小穿越時間。這有點辣手# 因爲我們不是所有的5000都達到了30.我們可以使用any方法來檢查hi30 = (np.abs(w) >= 30).any(1)print(hi30)print(hi30.sum())# 我們可以使用布爾值數組來選出絕對不輸超過30的步所在的行,並使用# argmax從軸向1上獲取時間c_time = (np.abs(w[hi30]) >= 30).argmax(1)print(c_time.mean())


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章