【Python】Numpy基础:数组和矢量运算
生活随笔
收集整理的這篇文章主要介紹了
【Python】Numpy基础:数组和矢量运算
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
Numpy基礎(chǔ):數(shù)組和矢量運(yùn)算
目錄:
文章目錄
- 一 Numpy及其重要性
- 二 ndarray:一種多維數(shù)組對象
- 1 創(chuàng)建ndarray
- 2 ndarray的數(shù)據(jù)類型
- 3 數(shù)組和標(biāo)量之間的運(yùn)算
- 4 基本的索引和切片
- ① 元素索引
- ② 切片索引
- ③ 布爾型索引
- ④ 花式索引
- ⑤ 數(shù)組轉(zhuǎn)置和軸對換
- 三 通用函數(shù):快速的元素級數(shù)組函數(shù)
- 四 利用數(shù)組進(jìn)行數(shù)據(jù)處理
- 1 將條件邏輯表述為數(shù)組計算
- 2 數(shù)學(xué)與統(tǒng)計方法
- 3 用于布爾型數(shù)組的方法
- 4 排序
- 5 唯一化及其他的集合邏輯
- 五 用于數(shù)組的文件輸入輸出
- 六 線性代數(shù)
- 七 隨機(jī)數(shù)生成
一 Numpy及其重要性
- Numpy(Numerical Python)是高性能科學(xué)計算和數(shù)據(jù)分析的基礎(chǔ)包,它是幾乎所有數(shù)據(jù)分析高級工具的構(gòu)建基礎(chǔ)。
① ndarray ,一個具有矢量算數(shù)運(yùn)算和復(fù)雜廣播能力的快速且節(jié)省空間的多維數(shù)組。
② 用于對整組數(shù)據(jù)進(jìn)行快速運(yùn)算的標(biāo)準(zhǔn)數(shù)學(xué)函數(shù)(無需編寫循環(huán))。
③ 用于讀寫磁盤數(shù)據(jù)的工具以及用于操作內(nèi)存映射文件的工具。
④ 線性代數(shù)、隨機(jī)數(shù)生成及傅里葉變換功能。
⑤ 用于集成由C,C++,Fortran等語言編寫的代碼的工具CAPI,將數(shù)據(jù)傳遞給外部庫(生態(tài)系統(tǒng)角度)。
⑥ Numpy本身并沒有提供多么高級的數(shù)據(jù)分析功能,理解Numpy數(shù)組以及面向數(shù)組的計算將有助于你更加高效地使用pandas等工具。精通面向數(shù)組的編程和思維方式是成為Python科學(xué)計算牛人的一大關(guān)鍵步驟。
- 對于大部分?jǐn)?shù)據(jù)分析應(yīng)用而言,最關(guān)注的功能主要集中于:
① 用于數(shù)據(jù)整理、自己構(gòu)建、過濾、轉(zhuǎn)換等快速的矢量化數(shù)組運(yùn)算。
② 常用的數(shù)組算法,如排序、唯一化、集合運(yùn)算等。
③ 高效的描述統(tǒng)計和數(shù)據(jù)聚合/摘要運(yùn)算。
④ 用于異構(gòu)數(shù)據(jù)集的合并/連接運(yùn)算的數(shù)據(jù)對齊和關(guān)系型數(shù)據(jù)運(yùn)算。
⑤ 將條件邏輯表述為數(shù)組表達(dá)式(而不是帶有if-elif-else分支的循環(huán))。
⑥ 數(shù)據(jù)的分組運(yùn)算(聚合、轉(zhuǎn)換、函數(shù)應(yīng)用等)。
二 ndarray:一種多維數(shù)組對象
- Numpy最重要的一個特點(diǎn)就是其N維數(shù)組對象:ndarray,該對象是一個快速而靈活的大數(shù)據(jù)集容器??梢岳眠@種數(shù)組對整塊數(shù)據(jù)執(zhí)行一些數(shù)學(xué)運(yùn)算,其語法與標(biāo)量元素之間的運(yùn)算一樣。
- ndarray是一個通用的同構(gòu)數(shù)據(jù)多維容器,其中所有的元素必須是相同類型的。每個數(shù)組都有一個shape(一個表示各維度大小的元組)和一個dtype(一個用于說明數(shù)據(jù)類型的對象)。
1 創(chuàng)建ndarray
- 序列型的對象
- 嵌套序列,嵌套序列將會被轉(zhuǎn)換為一個多維數(shù)組。
- np.array會嘗試為新建的數(shù)組推斷出一個較為合適的數(shù)據(jù)類型,數(shù)據(jù)類型保存在一個特殊的dtype對象中。
- 其他的創(chuàng)建數(shù)組的函數(shù)。
2 ndarray的數(shù)據(jù)類型
- dtype(數(shù)據(jù)類型)是一個特殊的對象,它含有ndarray將一塊內(nèi)存解釋為特定數(shù)據(jù)類型所需的信息:
- dtype是Numpy如此強(qiáng)大和靈活的原因之一。
- Numpy的數(shù)據(jù)類型:
- int8/uint8——有符號和無符號
- float64——浮點(diǎn)型
- complex64——復(fù)數(shù)
- bool——布爾型
- object——python對象類型
- string_——字符串類型
- unicode——unicode類型
- 可以通過ndarray的astype方法顯式地轉(zhuǎn)換其dtype
- 調(diào)用astype無論如何都會創(chuàng)建出一個新的數(shù)組(原始數(shù)據(jù)的一份拷貝),即使新dtype跟以前的一樣
3 數(shù)組和標(biāo)量之間的運(yùn)算
- 數(shù)組很重要,因為它使你不用編寫循環(huán)即可對數(shù)據(jù)執(zhí)行批量運(yùn)算。這通常就叫做矢量化。
- 大小相等的任何算術(shù)運(yùn)算都會將運(yùn)算應(yīng)用到元素級。
- 數(shù)組與標(biāo)量的算術(shù)運(yùn)算也會將那個標(biāo)量值傳播到各個元素。
- 不同大小的數(shù)組之間的運(yùn)算叫做廣播(廣播機(jī)制)。
4 基本的索引和切片
- Numpy數(shù)組的索引是一個內(nèi)容豐富的主題,因為選取數(shù)據(jù)子集或單個元素的方式有很多。
- 將一個標(biāo)量值賦值給一個切片時,該值會自動廣播到整個選區(qū)。
- 跟列表最重要的區(qū)別在于,數(shù)組切片是原始數(shù)組的視圖,這意味著數(shù)據(jù)不會被復(fù)制,視圖上的任何修改都會直接反映到源數(shù)據(jù)上。如果需要一份副本而非本視圖,則需要顯式復(fù)制操作:arr.copy()。
- Numpy的設(shè)計目的是處理大數(shù)據(jù)。Numpy將數(shù)據(jù)來回復(fù)制的話將會產(chǎn)生很多性能和內(nèi)存問題。
① 元素索引
- 對于高維度數(shù)組,能做的事情更多。在一個二維數(shù)組中,各索引位置上的元素不再是標(biāo)量,而是一維數(shù)組。
- 可以對高維數(shù)組各個元素進(jìn)行遞歸訪問,也可以傳入一個逗號隔開的索引列表來選取單個元素。
② 切片索引
- nadrray的切片語法跟python列表這樣的一維對象差不多。
- 高緯度對象的切片花樣比較多。可以在一個軸或者多個軸上進(jìn)行切片,也可以跟整數(shù)索引混合使用。
③ 布爾型索引
- 判斷滿足條件
④ 花式索引
- 花式索引是一個Numpy術(shù)語,它指的是利用整數(shù)數(shù)組進(jìn)行索引
⑤ 數(shù)組轉(zhuǎn)置和軸對換
- 轉(zhuǎn)置(transpose)是重塑的一種特殊形式,它返回的是源數(shù)據(jù)的視圖(不會進(jìn)行任何復(fù)制操作)
- T屬性。進(jìn)行矩陣計算時,經(jīng)常需要用到該操作。
三 通用函數(shù):快速的元素級數(shù)組函數(shù)
- 通用函數(shù)(ufunc)是一種對nadrray中的數(shù)據(jù)執(zhí)行元素級運(yùn)算的函數(shù)??梢詫⑵淇醋龊唵魏瘮?shù)(接受一個或多個標(biāo)量值,并產(chǎn)生一個 或多個標(biāo)量值)的 矢量化包裝器。
- 許多ufunc都是簡單的元素級變體。如np.sqrt() /np.exp()
- 一元ufunc(接受一個數(shù)組):
- abs/fabs #絕對值 ,非負(fù)數(shù)的絕對值。
- sqrt #計算各元素平方根。
- square #計算各元素平方。
- exp #計算各元素指數(shù)。
- log/log10/log2/log1p #計算各元素的自然對數(shù)。
- sign #計算各元素的正負(fù)號。
- ceil #計算各元素的ceiling值,即大于等于該值的最小整數(shù)。
- floor #計算各元素的floor值,即小于等于該值的最大整數(shù)。
- rint #將各元素四舍五入到最接近的整數(shù)。
- modf #將數(shù)組的小數(shù)和整數(shù)部分以兩個獨(dú)立數(shù)組的形式返回。
- isnan #返回一個表示“哪些值是NaN”的布爾型數(shù)組。
- isfinite/isinf #返回表示無窮的布爾型數(shù)組。
- cos/cosh/sin/sinh/tan/tanh #三角函數(shù)
- 二元ufunc(接受兩個數(shù)組):
- add #將數(shù)組中對應(yīng)的元素相加
- subtract #從第一個數(shù)組中減去第二個數(shù)組中的元素。
- multiply #數(shù)組元素相乘。
- divide/floor_divide #除法或向下圓整除法,丟棄余數(shù)。
- power #計算第二個數(shù)組元素b相對于第一個數(shù)組中元素a的計算:a的b次方。
- maximum/fmax #元素級的最大值計算,忽略NaN。
- minimum/fmin #元素級的最小值計算,忽略NaN。
- copysign #將第二個數(shù)組的值得符號復(fù)制給第一個數(shù)組中對應(yīng)的值。
- greater/greater_equal/less/less_equal/equal/not_equal #執(zhí)行元素級的比較運(yùn)算,最終產(chǎn)生布爾型數(shù)組。
- logical_and/logical_or/logical_xor #執(zhí)行元素級的真值邏輯運(yùn)算 (與或非)。
四 利用數(shù)組進(jìn)行數(shù)據(jù)處理
- Numpy數(shù)組可以將許多種數(shù)據(jù)處理任務(wù)表述為簡潔的數(shù)組表達(dá)式(否則需要編寫循環(huán))。
- 用數(shù)組表達(dá)式代替循環(huán)的做法,通常被稱作矢量化。一般來說,矢量化數(shù)組運(yùn)算比等價的純python方法快1~2個數(shù)量級(甚至更多)。
- 廣播——是一種針對矢量化計算的強(qiáng)大手段。
1 將條件邏輯表述為數(shù)組計算
- 在數(shù)據(jù)分析中,where通常用于根據(jù)一個數(shù)組而產(chǎn)生一個新的數(shù)組。
- np.where函數(shù)是三元表達(dá)式x if condition else y 的矢量化版本。
- np.where的第二個和第三個參數(shù)不必是數(shù)組,傳遞給where的數(shù)組大小可以不相等,甚至可以是標(biāo)量值。
- 多層嵌套使用,功能更加強(qiáng)大。
2 數(shù)學(xué)與統(tǒng)計方法
- 可以通過數(shù)組上的一組數(shù)學(xué)函數(shù)對整個數(shù)組或某個軸向的數(shù)據(jù)進(jìn)行統(tǒng)計計算、聚合運(yùn)算(aggregation 通常叫做約簡)。
- 基本數(shù)組統(tǒng)計方法:
- sum #對數(shù)組中全部或者軸向的元素求和。
- mean #算術(shù)平均數(shù)
- std/var #分別為標(biāo)準(zhǔn)差和方差,自由度可調(diào)
- min/max #最大值和最小值
- argmin/argmax #最大和最小元素的索引
- cumsum #累計和
- cumprod #累計積
- sum和mean等函數(shù)可以接受一個axis參數(shù),用于計算軸向的統(tǒng)計值,得到一個少一維的數(shù)組。
- cumsum、cumprod之類的方法不聚合,產(chǎn)生一個由中間結(jié)果組成的數(shù)組。
3 用于布爾型數(shù)組的方法
4 排序
- 跟python一樣,Numpy數(shù)組也可以通過sort方法就地排序。
- 多維數(shù)組可以在任意一個軸上進(jìn)行排序,只要給出軸編號傳給sort即可。
- 頂級方法返回的是數(shù)組的已排序副本,而就地排序會修改數(shù)組本身。
- 計算數(shù)組分位數(shù)最簡單的方法是對齊進(jìn)行排序,然后選取特定位置的值。
5 唯一化及其他的集合邏輯
- Numpy提供了一些針對一維ndarray的基本集合運(yùn)算。
- 數(shù)組的集合運(yùn)算:
- unique(x) #計算x中的唯一元素,并返回有序結(jié)果。等價于純python代碼中的set()。
- intersect1d(x,y) #計算x和y中的公共元素,并返回有序結(jié)果。
- union1d(x,y) #計算x和y的并集,并返回有序結(jié)果。
- in1d(x,y) #得到一個表示“x是否包含于y”的布爾型數(shù)組。
- setdiff1d(x,y) #集合的差,即元素在x中且不在y中。
- setxor1d(x,y) #集合的對稱差,即存在于一個數(shù)組中但不同時存在于兩個數(shù)組中的元素。
五 用于數(shù)組的文件輸入輸出
- Numpy可以讀寫磁盤上的文本數(shù)據(jù)或者二進(jìn)制數(shù)據(jù)
- np.save和np.load是讀寫磁盤數(shù)組數(shù)據(jù)的兩個主要函數(shù)
六 線性代數(shù)
-
線性代數(shù)(如矩陣乘法、矩陣分解、行列式及其他方陣數(shù)學(xué)等)是任何數(shù)據(jù)庫的重要組成部分。
-
Numpy.ligalg中有一組標(biāo)準(zhǔn)的矩陣分解運(yùn)算以及諸如求逆合行列式之類的東西:
- diag #以一維數(shù)組的形式返回方陣的對角線(或非對角線)元素,或?qū)⒁痪S數(shù)組轉(zhuǎn)換為方陣(非對角線元素為0)。
- dot #矩陣乘法。
- trace #計算對角線元素的和。
- det #計算矩陣行列式。
- eig #計算方陣的本征值和本征向量。
- inv #計算方陣的逆。
- pinv #計算矩陣的MP偽逆。
- qr #計算QR分解。
- svd #計算奇異值分解(SVD)。
- solve #解線性方程組ax = b,其中a為一個方陣。
- lstsq #計算ax = b的最小二乘解。
七 隨機(jī)數(shù)生成
- Numpy.random模塊對python內(nèi)置的random進(jìn)行了補(bǔ)充,增加了一些用于高效生成多種概率分布的樣本值函數(shù)。而python內(nèi)置的random模塊則只能一次生成一個樣本值,且需要生成在大量樣本值時,Numpy.random快了不止一個量級。
- 部分Numpy.random函數(shù):
- seed #確定隨機(jī)數(shù)生成器的種子。
- permutation #返回一個序列的隨機(jī)排列或返回一個隨機(jī)排列的范圍。
- shuffle #對一個序列就地隨機(jī)排列。
- rand #產(chǎn)生均勻分布的樣本值。
- randint #從給定的上下限范圍內(nèi)隨機(jī)選取整數(shù)。
- randn #產(chǎn)生正態(tài)分布(平均值為0,標(biāo)準(zhǔn)差為1)的樣本值。
- binomial #產(chǎn)生二項分布的樣本值。
- normal #產(chǎn)生正態(tài)(高斯)分布的樣本值。
- beta #產(chǎn)生beta分布的樣本值。
- chisquare #產(chǎn)生卡方分布的樣本值。
- gamma #產(chǎn)生gamma分布的樣本值。
- uniform #產(chǎn)生在[0,1]中 均勻分布的樣本值。
- 隨機(jī)漫步
- 通過模擬隨機(jī)漫步來說明如何而運(yùn)用數(shù)組運(yùn)算。
- 首次穿越時間。
- 一次模擬多個隨機(jī)漫步。
總結(jié)
以上是生活随笔為你收集整理的【Python】Numpy基础:数组和矢量运算的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【项目实战】运营商数据信息的特征挖掘(调
- 下一篇: 【Python】Pandas基础:结构化