NumPy入門

qq:875880047

NumPy簡介

? 官網(wǎng)鏈接:http://www.numpy.org/

? NumPy是Python語言的一個(gè)擴(kuò)充程序庫。支持高級大量的維度數(shù)組與矩陣運(yùn)

算,此外也針對數(shù)組運(yùn)算提供大量的數(shù)學(xué)函數(shù)庫。

? 作者介紹

? Jim Hugunin: http://www.linkedin.com/in/jimhugunin? Travis Oliphant: http://www.linkedin.com/in/teoliphant

基本功能

快速高效的多維數(shù)組對象ndarray

用于對數(shù)組執(zhí)行元素級計(jì)算以及直接對數(shù)組執(zhí)行數(shù)學(xué)運(yùn)算的函數(shù)

用于讀寫硬盤上基于數(shù)組的數(shù)據(jù)集的工具

線性代數(shù)運(yùn)算、傅里葉變換,以及隨機(jī)數(shù)生成

用于將C、C++、Fortran代碼集成到Python的工具

除了為Python提供快速的數(shù)組處理能力,NumPy在數(shù)據(jù)分析方面還有另外一

個(gè)主要作用,即作為在算法之間傳遞數(shù)據(jù)的容器。

效率對比

? 三種數(shù)據(jù)結(jié)構(gòu):list / array / numpy.array? 三種方法求和:for / sum / numpy.sum

? 例子代碼:extra/perf_compare.py

NumPy的ndarray 創(chuàng)建ndarray? 數(shù)組創(chuàng)建函數(shù)

類型說明

array將輸入數(shù)據(jù)(列表、元組、數(shù)組或其它序列類型)轉(zhuǎn)換為ndarray。要么推斷出dtype,

要么顯示指定dtype。默認(rèn)直接復(fù)制輸入數(shù)據(jù)。

asarray將輸入轉(zhuǎn)換為darray,如果輸入本身就是一個(gè)ndarray就不進(jìn)行復(fù)制。

arange類似于內(nèi)置的range,但返回一個(gè)ndarray而不是列表。

ones, ones_like根據(jù)指定形狀和dtype創(chuàng)建一個(gè)全1數(shù)組。ones_like以另一個(gè)數(shù)組為參數(shù),并根據(jù)其形

狀和dtype創(chuàng)建一個(gè)全1數(shù)組。

zeros, zeros_like類似于ones和ones_like,只不過產(chǎn)生的是全0數(shù)組而已。

empty, empty_like創(chuàng)建數(shù)組,只分配內(nèi)存空間但不填充任何值。

eye, identity創(chuàng)建一個(gè)正方的N * N單位矩陣

? 例子代碼:the_numpy_ndarray/creating_ndarray.py

NumPy的ndarray NumPy數(shù)據(jù)類型? NumPy數(shù)據(jù)類型 I

類型說明

int8, uint8 - i1, u1有/無符號的8位整型

int16, uint16 - i2, u2有/無符號的16位整型

int32, uint32 - i4, u4有/無符號的32位整型

int64, uint64 - i8, u8有/無符號的64位整型

float16 - f2半精度浮點(diǎn)數(shù)

float32 - f4 or f標(biāo)準(zhǔn)的單精度浮點(diǎn)數(shù),與C的float兼容。

float64 - f8 or d標(biāo)準(zhǔn)的雙精度浮點(diǎn)數(shù)。與C的double和Python的float兼容。

float128 - f16 or g擴(kuò)展精度浮點(diǎn)數(shù)

NumPy的ndarray NumPy數(shù)據(jù)類型? NumPy數(shù)據(jù)類型 II

類型說明

complex64/128/256 -

c8/16/32

分別用兩個(gè)32位,64位或128位浮點(diǎn)數(shù)表示的復(fù)數(shù)。

bool - ?存儲True和False值的布爾類型

object - OPython對象類型

string_ - S固定長度的字符串類型。S10代表長度為10的字符串。

unicode_ - U固定長度的unicode類型

? 創(chuàng)建ndarray時(shí)指定dtype類型

? 使用astype顯示轉(zhuǎn)換類型

? 例子代碼:the_numpy_ndarray/creating_ndarray.py

NumPy的ndarray 數(shù)組和標(biāo)量之間的運(yùn)算

不用編寫循環(huán)即可對數(shù)據(jù)執(zhí)行批量運(yùn)算

大小相等的數(shù)組之間的任何算術(shù)運(yùn)算都會將運(yùn)算應(yīng)用到元素級

數(shù)組與標(biāo)量的算術(shù)運(yùn)算也會將那個(gè)標(biāo)量值傳播到各個(gè)元素

例子代碼:

the_numpy_ndarray/operations_between_arrays_and_scalars.py

NumPy的ndarray 基本的索引和切片

? 索引原理

? 切片原理

? 例子代碼: the_numpy_ndarray/basic_indexing_and_slicing.py

NumPy的ndarray 布爾型索引

? 布爾型數(shù)組的長度必須跟被索引的軸長度一致。

? 可以將布爾型數(shù)組跟切片、整數(shù)(或整數(shù)序列)混合使用? 例子代碼: the_numpy_ndarray/boolean_indexing.py

NumPy的ndarray 花式索引

花式索引(Fancy indexing)是一個(gè)NumPy術(shù)語,它指的是利用整數(shù)數(shù)組進(jìn)

行索引。

一次傳入多個(gè)索引數(shù)組會有一點(diǎn)特別。它返回的是一個(gè)一維數(shù)組,其中的元素

對應(yīng)各個(gè)索引元組。

例子代碼: the_numpy_ndarray/fancy_indexing.py

NumPy的ndarray 數(shù)組轉(zhuǎn)置和軸對換

? 一維/二維數(shù)組轉(zhuǎn)置

? 高維數(shù)組軸對換

? 例子代碼:

the_numpy_ndarray/transposing_arrays_and_swapping_axes.py

NumPy的ndarray 快速的元素級數(shù)組函數(shù)? 一元函數(shù) I

類型說明

abs, fabs計(jì)算整數(shù)、浮點(diǎn)數(shù)或復(fù)數(shù)的絕對值。對于非復(fù)數(shù)值,可以使用更快的fabs。

sqrt計(jì)算各元素的平方根。相當(dāng)于arr ** 0.5

sqare計(jì)算各元素的平方。相當(dāng)于arr ** 2

exp計(jì)算各元素的e^x

log, log10, log2, log1p分別為自然對數(shù)、底數(shù)為10的log、底數(shù)為2的log和log(1 + x)。

sign計(jì)算各元素的正負(fù)號:1(正數(shù))、0(零)、-1(負(fù)數(shù))。

ceil計(jì)算各元素的ceiling值,即大于等于該值的最小整數(shù)。

floor計(jì)算各元素的floor值,即小于等于該值的最小整數(shù)。

NumPy的ndarray 快速的元素級數(shù)組函數(shù)? 一元函數(shù) II

類型說明

rint將各元素值四舍五入到最接近的整數(shù),保留dtype。

modf將數(shù)組的小數(shù)部分與整數(shù)部分以兩個(gè)獨(dú)立數(shù)組的形式返還。

isnan返回一個(gè)表示“哪些值是NaN(這不是一個(gè)數(shù)字)”的布爾型數(shù)組

isfinite, isinf分別返回一個(gè)表示“哪些元素是有限的(非inf,非NaN)”或“哪些元素是

無窮的”的布爾型數(shù)組

cos, cosh, sin, sinh, tan, tanh普通型或雙曲型三角函數(shù)

arccos, arccosh, arcsin, arcsinh,

arctan, arctanh

反三角函數(shù)

logical_not計(jì)算各元素not x的真值。相當(dāng)于-arr。

NumPy的ndarray 快速的元素級數(shù)組函數(shù)? 二元函數(shù) I

類型說明

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

subtract從第一個(gè)數(shù)組中減去第二個(gè)數(shù)組中的元素

multiply數(shù)組元素相乘

divide, floor_divide除法或向下取整除法

power對第一個(gè)數(shù)組中的元素A和第二個(gè)數(shù)組中對應(yīng)位置的元素B,計(jì)算A^B。

maximum, fmax元素級的最大值計(jì)算。fmax將忽略NaN。

minimum, fmin元素級的最小值計(jì)算。fmin將忽略NaN。

mod元素級的求模計(jì)算

NumPy的ndarray 快速的元素級數(shù)組函數(shù)? 二元函數(shù) II

類型說明

copysign將第二個(gè)數(shù)組中的符號復(fù)制給第一個(gè)數(shù)組中的值

greater, greater_equal, less,

less_equal,equal, not_equal

執(zhí)行元素級的比較,最終產(chǎn)生布爾型數(shù)組。

logical_and, logical_or,

logical_xor

執(zhí)行元素級的真值邏輯運(yùn)算,最終產(chǎn)生布爾型數(shù)組。

? 例子代碼: universal_functions.py

利用數(shù)組進(jìn)行數(shù)據(jù)處理 簡介

? NumPy數(shù)組使你可以將許多種數(shù)據(jù)處理任務(wù)表述為簡潔的數(shù)組表達(dá)式(否則需

要編寫循環(huán))。用數(shù)組表達(dá)式代替循環(huán)的做法,通常被稱為矢量化。

? 矢量化數(shù)組運(yùn)算要比等價(jià)的純Python方式快上一兩個(gè)數(shù)量級? 例子代碼:data_processing_using_arrays/intro.py

利用數(shù)組進(jìn)行數(shù)據(jù)處理 將條件邏輯表述為數(shù)組運(yùn)算

列表推導(dǎo)的局限性

? 純Python代碼,速度不夠快。? 無法應(yīng)用于高維數(shù)組

where和where的嵌套

例子代碼:

data_processing_using_arrays/expressing_conditional_logic_as_array_op

erations.py

利用數(shù)組進(jìn)行數(shù)據(jù)處理 數(shù)學(xué)和統(tǒng)計(jì)方法? 數(shù)學(xué)和統(tǒng)計(jì)方法

類型說明

sum對數(shù)組中全部或某軸向的元素求和。零長度的數(shù)組的sum為0。

mean算術(shù)平均數(shù)。零長度的數(shù)組的mean為NaN。

std, var分別為標(biāo)準(zhǔn)差和方差,自由度可調(diào)(默認(rèn)為n)。

min, max最大值和最小值

argmin分別為最大值和最小值的索引

cumsum所有元素的累計(jì)和

cumprod所有元素的累計(jì)積

利用數(shù)組進(jìn)行數(shù)據(jù)處理 數(shù)學(xué)和統(tǒng)計(jì)方法

標(biāo)準(zhǔn)差和方差的解釋

cumsum和cumprod的解釋

帶axis參數(shù)的統(tǒng)計(jì)函數(shù)

例子代碼:

data_processing_using_arrays/mathematical_and_statistical_methods.py

利用數(shù)組進(jìn)行數(shù)據(jù)處理 用于布爾型數(shù)組的方法

? sum對True值計(jì)數(shù)

? any和all測試布爾型數(shù)組,對于非布爾型數(shù)組,所有非0元素將會被當(dāng)做True。

? 例子代碼:

data_processing_using_arrays/methods_for_boolean_arrays.py

利用數(shù)組進(jìn)行數(shù)據(jù)處理 排序

? 直接排序

? 指定軸排序

? 例子代碼:data_processing_using_arrays/sorting.py

利用數(shù)組進(jìn)行數(shù)據(jù)處理 去重以及其它集合運(yùn)算? 去重以及其它集合運(yùn)算

類型說明

unique(x)計(jì)算x中的唯一元素,并返回有序結(jié)果。

intersect1d(x, y)計(jì)算x和y中的公共元素,并返回有序結(jié)果。

union1d(x, y)計(jì)算x和y的并集,并返回有序結(jié)果。

in1d(x, y)得到一個(gè)表述"x的元素是否包含于y"的布爾型數(shù)組

setdiff1d(x, y)集合的差,即元素在x中且不在y中

setxor1d(x, y)集合的異或,即存在于一個(gè)數(shù)組中但不同時(shí)存在于兩個(gè)數(shù)組中的元素。

? 例子代碼: data_processing_using_arrays/unique_and_other_set_logic.py

數(shù)組文件的輸入輸出

? 將數(shù)組以二進(jìn)制格式保存到磁盤

? 存取文本文件

? 例子代碼

? file_input_and_output_with_arrays/saving_and_loading_text_files.py

? file_input_and_output_with_arrays/storing_arrays_on_disk_in_binary_format.py

線性代數(shù)

? 常用的numpy.linalg函數(shù) I

類型說明

diag以一維數(shù)組的形式返回方陣的對角線(或非對角線元素),獲將一維數(shù)組轉(zhuǎn)換

為方陣(非對角線元素為0)。

dot矩陣乘法

trace計(jì)算對角線元素的和

det計(jì)算矩陣行列式

eig計(jì)算方陣的特征值和特征向量

inv計(jì)算方陣的逆

線性代數(shù)

? 常用的numpy.linalg函數(shù) II

類型說明

pinv計(jì)算矩陣的Moore-Penrose偽逆

qr計(jì)算QR分解

svd計(jì)算奇異值分解

solve解線性方程Ax = b,其中A為一個(gè)方陣。

lstsq計(jì)算Ax = b的最小二乘解

? 例子代碼: linear_algebra.py

隨機(jī)數(shù)生成

? 部分numpy.random函數(shù) I

類型說明

seed確定隨機(jī)數(shù)生成器的種子

permutation返回一個(gè)序列的隨機(jī)排列或返回一個(gè)隨機(jī)排列的返回

shuffle對一個(gè)序列就地隨機(jī)亂序

rand產(chǎn)生均勻分布的樣本值

randint從給定的上下限范圍內(nèi)隨機(jī)選取整數(shù)

randn產(chǎn)生正態(tài)分布(平均值為0,標(biāo)準(zhǔn)差為1)

binomial產(chǎn)生二項(xiàng)分布的樣本值

隨機(jī)數(shù)生成

? 部分numpy.random函數(shù) II

類型說明

normal產(chǎn)生正態(tài)(高斯)分布的樣本值

beta產(chǎn)生Beta分布的樣本值

chisquare產(chǎn)生卡方分布的樣本值

gamma產(chǎn)Gamma分布的樣本值

uniform產(chǎn)生在[0, 1]中均勻分布的樣本值

? 例子代碼: random_number_generation.py

高級應(yīng)用 數(shù)組重塑

? reshape重塑數(shù)組

? -1自動推導(dǎo)維度大小

? 例子代碼:advanced_array_manipulation/reshaping_arrays.py

高級應(yīng)用 數(shù)組的合并和拆分? 數(shù)組連接函數(shù)

類型說明

concatenate最一般化的連接,沿一條軸連接一組數(shù)組

vstack, row_stack以面向行的方式對數(shù)組進(jìn)行堆疊(沿軸0)

hstack,以面向行的方式對數(shù)組進(jìn)行堆疊(沿軸1)

column_stack類似于hstack,但是會先將一維數(shù)組轉(zhuǎn)換為二維列向量。

dstack以面向“深度”的方式對數(shù)組進(jìn)行堆疊(沿軸2)

split沿指定軸在指定的位置拆分?jǐn)?shù)組

hsplit, vsplit, dsplitsplit的便捷化函數(shù),分別沿著軸0、軸1和軸2進(jìn)行拆分。

高級應(yīng)用 數(shù)組的合并和拆分

? _r對象

? _c對象

? 例子代碼:

advanced_array_manipulation/concatenating_and_splitting_arrays.py

高級應(yīng)用 元素的重復(fù)操作

? _tile

? _repeat

? 例子代碼:advanced_array_manipulation/repeating_elements.py

高級應(yīng)用 花式索引的等價(jià)函數(shù)

? take

? put

? 例子代碼:advanced_array_manipulation/fancy_indexing_equivalents.py

例題分析 距離矩陣計(jì)算

給定m × n階矩陣X,滿足X = [x1, x2, ... xn],這里第i列向量是m維向量。

求n × n矩陣,使得Dij = ||xi - xj||2

例題分析 距離矩陣計(jì)算

? 方法1:標(biāo)準(zhǔn)方法計(jì)算Dij

? D[i, j] = numpy.linalg.norm(X[:, i], X[:, j) ** 2

? 方法2:利用dot計(jì)算Dij

? d=X[:,i]-X[:,j]

? D[i, j] = numpy.dot(d, d)

例題分析 距離矩陣計(jì)算

? 方法3:減少dot調(diào)用次數(shù)

Dij = (xi - xj)T(xi - xj) = xiTxi - 2xiTxj + xjTxj

G = numpy.dot(X.T, X)? Dij =Gii -2Gij +Gjj

例題分析 距離矩陣計(jì)算

? 方法4:利用重復(fù)操作替代外部循環(huán)

在方法3的基礎(chǔ)上,將D表達(dá)為H + K - 2G

Hij =Gii,Kij =Gjj

H = numpy.title(np.diag(G), (n, 1))

K=HT

D=H+HT-2G

? 例子代碼:extra/dist_matrix.py


有想學(xué)習(xí)python或 人工智能,數(shù)據(jù)分析,算法以及機(jī)器學(xué)習(xí)的請聯(lián)系我,qq:875880047?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容