NumPy基礎(chǔ):數(shù)組與向量化計算
公司主營業(yè)務(wù):網(wǎng)站制作、網(wǎng)站設(shè)計、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團隊。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)推出蒼溪免費做網(wǎng)站回饋大家。
安裝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())