setting-->項目名-->Project Interpreter-->本..."/>
溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

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

發(fā)布時間:2020-06-23 10:27:45 來源:網(wǎng)絡(luò) 閱讀:618 作者:ckllf 欄目:編程語言

  NumPy基礎(chǔ):數(shù)組與向量化計算

  安裝numpy及使用

  pip install numpy

  PyCharm無法使用numpy

  File-->setting-->項目名-->Project Interpreter-->本地安裝python-->應(yīng)用

  測試代碼

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

  numpy簡介

  作用

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

  對所有數(shù)據(jù)進行快速的矩陣計算,而無需編寫循環(huán)程序

  對硬盤中數(shù)組數(shù)據(jù)進行讀寫的工具,并對內(nèi)存映射文件進行操作

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

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

  數(shù)據(jù)分析應(yīng)用

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

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

  高效的描述性統(tǒng)計和聚合/概述數(shù)據(jù)

  數(shù)據(jù)排列和相關(guān)數(shù)據(jù)操作,例如對異構(gòu)數(shù)據(jù)進行merge和join

  使用數(shù)組表達式來表明條件邏輯,代替if-elif-else條件分支的循環(huán)

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

  python數(shù)組計算歷程

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

  NumPy重要原因

  NumPy在內(nèi)部將數(shù)據(jù)存儲在連續(xù)的內(nèi)存塊上,這與其他的Python內(nèi)建數(shù)據(jù)結(jié)構(gòu)是不同的。NumPy的算法庫是用C語言寫的,所以在操作數(shù)據(jù)內(nèi)存時不需要任何類型檢查或者其他管理操作。NumPy數(shù)組使用的內(nèi)存量也小于其他Pyhon內(nèi)建序列。

  Numpy可以針對全量數(shù)組進行復(fù)雜計算而不需要寫Python循環(huán)。

  性能對比代碼

  # NumPy性能和Python常規(guī)對比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:多維數(shù)組對象

  ndarray

  NumPy的核心特征之一就是N-維數(shù)組對象--ndarray。ndarray是Python中一個快速、靈活的大型數(shù)據(jù)集容器。數(shù)組允許你使用類似于標(biāo)量的操作語法在整塊數(shù)據(jù)上進行數(shù)學(xué)計算。

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

  生成ndarray

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

  屬性

  ndim 數(shù)組緯度

  shape 數(shù)組緯度和數(shù)量

  dtype 數(shù)組類型

  數(shù)組生成函數(shù)

  array 將輸入數(shù)據(jù)(可以是列表、元組、數(shù)組以及其他序列)轉(zhuǎn)換為ndarray,如不顯式指明數(shù)據(jù)類型,將自動判斷;默認(rèn)復(fù)制所有的輸入數(shù)據(jù)。

  asarray 將輸入轉(zhuǎn)換為ndarray,但如果輸入已經(jīng)是ndarray則不再復(fù)制

  arange Python內(nèi)建函數(shù)range的數(shù)組版,返回一個數(shù)組

  ones 根據(jù)給定形狀和數(shù)據(jù)類型生成全1數(shù)組

  ones_like 根據(jù)所誒數(shù)組生成一個形狀一樣的全1數(shù)組

  zeros 根據(jù)給定形狀和數(shù)據(jù)類型生成全0數(shù)組

  zeros_like 根據(jù)所給的數(shù)組生成一個形狀一樣的全0數(shù)組

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

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

  full 根據(jù)給定的形狀和數(shù)據(jù)類型生成指定數(shù)值的數(shù)組

  full_like 根據(jù)所給的數(shù)組生成一個形狀一樣但內(nèi)容是指定數(shù)值的數(shù)組

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

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

  ndarray數(shù)據(jù)類型

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

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

  數(shù)據(jù)類型

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

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

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

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

  float16 類型代碼f2 半精度浮點數(shù)

  float32 類型代碼f4或f 標(biāo)準(zhǔn)單精度浮點數(shù);兼容C語言float

  float64 類型代碼f8或d 標(biāo)準(zhǔn)雙精度浮點數(shù);兼容C語言double和Python float

  float128 類型代碼f16或g 拓展精度浮點數(shù)

  complex64,complex128,complex256 類型代碼c8,c16,c32 分別基于32位、64位、128位浮點數(shù)的復(fù)數(shù)

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

  object 類型代碼O Python object類型

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

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

  浮點數(shù)轉(zhuǎn)換成整數(shù)則小數(shù)點后的部分將被消除

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

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

  NumPy數(shù)組算術(shù)

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

  帶有標(biāo)量計算的算術(shù)操作,會把計算參數(shù)傳遞給數(shù)組的每個元素

  同尺寸數(shù)組之間的比較,會產(chǎn)生一個布爾值數(shù)組

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

  基礎(chǔ)索引與切片

  數(shù)組切片是原數(shù)組的視圖,意味著數(shù)據(jù)并不是被復(fù)制了任何對于視圖的修改都會反應(yīng)在原數(shù)組上

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

  在一個二維數(shù)組中,每個索引值對應(yīng)的元素不是一個值而是一個一維數(shù)組。

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

  數(shù)組切片索引

  數(shù)組延著軸0進行切片,表達式arr[:2]的含義為選擇arr的前兩行

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

  注意:單獨一個冒號標(biāo)識選擇整個軸上的數(shù)組

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

  arr[2] 第三行數(shù)據(jù)

  arr[2,:] 第三行數(shù)據(jù)

  arr[2:,:] 第三行數(shù)據(jù)

  arr[:,:2] 所有行數(shù)據(jù)和首列到第二列

  布爾索引

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

  當(dāng)布爾值數(shù)組的長度不正確時,布爾值選擇數(shù)據(jù)的方法并不會報錯,因此建議在使用該特性要注意

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

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

  Python中的關(guān)鍵字and或or對布爾值數(shù)據(jù)并沒有用,要使用&(and)和|(or)來代替

  神奇索引

  神奇索引時NumPy中的術(shù)語,用于描述使用整數(shù)數(shù)組進行數(shù)據(jù)索引。

  神奇搜索與切片不同,他總是將數(shù)據(jù)復(fù)制到一個新的數(shù)組中。

  正數(shù)數(shù)組從前索引,負(fù)數(shù)數(shù)組從后索引

  數(shù)組轉(zhuǎn)置和換軸

  轉(zhuǎn)置是一種特殊的數(shù)據(jù)重組形式,可以返回底層數(shù)據(jù)的視圖而不需要復(fù)制任何內(nèi)容。數(shù)組擁有transpose方法,也有特殊的T屬性。

  T屬性就是數(shù)據(jù)反轉(zhuǎn)

  計算矩陣內(nèi)積會使用np.dot

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

  使用.T進行轉(zhuǎn)置是換軸的一個特殊案例,ndarray有一個swapaxes方法,該方法接收一個對軸編號作為參數(shù),并對軸進行調(diào)整用于重組數(shù)據(jù)

  swapaxes返回的是數(shù)據(jù)視圖,而沒有對數(shù)據(jù)進行復(fù)制

  通用函數(shù):快速的逐元素數(shù)組函數(shù)

  含義

  通用函數(shù),也可以稱為ufunc,是一種ndarray數(shù)據(jù)中進行逐元素操作的函數(shù)。

  某些簡單函數(shù)接收一個或者多個標(biāo)量數(shù)值,并產(chǎn)生一個或者多個標(biāo)量結(jié)果,而通過函數(shù)就是對這些簡單函數(shù)的向量化封裝

  一元通用函數(shù)

  abs、fabs 逐元素地計算整數(shù)、浮點數(shù)或者復(fù)數(shù)的絕對值

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

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

  exp 計算每個元素的自然數(shù)指數(shù)值ex

  log、log10、log2、log1p 分別對應(yīng):自然數(shù)對數(shù)(e為底)、對數(shù)10位底、對數(shù)2為底、log(1+x)

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

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

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

  rint 將元素保留整數(shù)位,并保持dtype

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

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

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

  cos、cosh、sin、sinh、tan、tanh 常規(guī)的雙曲三角函數(shù)

  arccos、arccosh、arcsin、arcsinh、arctan、arctanh 反三角函數(shù)

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

  二元通用函數(shù)

  add 將數(shù)組的對應(yīng)元素相加

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

  multiply 將數(shù)組的對應(yīng)元素相乘

  divide、floor_divide 除或者整除(放棄余數(shù))

  power 將第二個數(shù)組的元素作為第一個數(shù)組對應(yīng)元素的冪次方

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

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

  mod 按元素的求摸計算(即求除法的余數(shù))

  copysign 將第一個數(shù)組的符號值改為第二個數(shù)組的符號值

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

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

  使用數(shù)組進行面向數(shù)組編程

  含義

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

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

  將條件邏輯作為數(shù)組操作

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

  np.where 的第一個參數(shù)是條件,第二個和第三個參數(shù)并不一定是數(shù)組可以是標(biāo)量

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

  傳遞給np.where的數(shù)組即可以是同等大小的數(shù)組,也可以是標(biāo)量

  數(shù)學(xué)和統(tǒng)計方法

  許多關(guān)于計算整個數(shù)組統(tǒng)計值或者關(guān)于軸向數(shù)據(jù)的數(shù)學(xué)函數(shù),可以作為數(shù)組類型的方法被調(diào)用。你可以使用聚合函數(shù)(通常也叫縮減函數(shù)),比如sum、mean和std(標(biāo)準(zhǔn)差),即可以直接調(diào)用數(shù)組實例的方法,也可以使用頂層的NumPy函數(shù)。

  基礎(chǔ)數(shù)組統(tǒng)計方法

  sum 沿著軸向計算所有元素的累和,0長度的數(shù)組,累和為0

  mean 數(shù)學(xué)平均,0長度的數(shù)組平均值為NaN

  std、var 標(biāo)準(zhǔn)差和方差,可以選擇自由度調(diào)整(默認(rèn)分母n)

  min、max 最小值和最大值

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

  cumsum 從0開始元素累積和

  cumprod 從1開始元素累積積

  布爾值數(shù)組的方法

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

  可以通過sum用于計算布爾值數(shù)組中True的個數(shù)

  any檢查數(shù)組中是否至少有一個True

  all檢查是否每個值都是True

  排序鄭州人流醫(yī)院 http://m.zzzy120.com/

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

  在多維數(shù)組中根據(jù)傳遞的axis值,沿著軸向?qū)γ總€一維數(shù)據(jù)段進行排序

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

  唯一值與其他集合邏輯

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

  數(shù)組集合操作

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

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

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

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

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

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

  使用數(shù)組進行文件輸入和輸出

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

  大部分用戶更傾向于與使用pandas或者其他工具來載入文本或者表格型數(shù)據(jù)

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

  壓縮好的數(shù)據(jù)可能會想要使用numpy.savez_compressed將數(shù)據(jù)存入已經(jīng)壓縮的文件中

  線性代數(shù)

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

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

  numpy.linalg 擁有一個矩陣分解標(biāo)準(zhǔn)的函數(shù)集,以及其他常用函數(shù)。

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

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

  常用numpy.linalg函數(shù)

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

  dot 矩陣點乘

  trace 計算對角元素和

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

  inv 計算方陣的逆矩陣

  pinv 計算矩陣的Moore-Penrose偽逆

  qr 計算QR分解

  svd 計算奇異值分解(SVD)

  solve 求解x的線性系統(tǒng)Ax = b ,其中A是方陣

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

  偽隨機數(shù)生成

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

  Python內(nèi)建random模塊一次中能生成一個值

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

  numpy.random中的數(shù)據(jù)生成函數(shù)使用一個全局隨機數(shù)種子。為了避免全局狀態(tài),你可以使用numpy.random.RandomState創(chuàng)建一個隨機數(shù)生成器,使數(shù)據(jù)獨立于其他的隨機數(shù)狀態(tài)

  numpy.random中的部分函數(shù)

  seed 向隨機數(shù)生成器傳遞隨機狀態(tài)種子

  permutation 返回一個序列的隨機排列,或者返回一個亂序的整數(shù)范圍序列

  shuffle 隨機排列一個序列

  rand 從均勻分布中抽取樣本

  randint 根據(jù)給定的由低到高的范圍抽取隨機整數(shù)

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

  binomial 從二項分布中抽取樣本

  normal 從正態(tài)(高斯)分布中抽取樣本

  beta 從beta分布中抽取樣本

  chisquare 從卡方分布中抽取樣本

  gamma 從伽馬分布中抽取樣本

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

  示例:隨機漫步

  隨機漫步模型提供了一個適用數(shù)組操作的說明性應(yīng)用

  一次性模擬多次隨機漫步

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


向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI