qq:875880047
NumPy簡介
? 官網(wǎng)鏈接:http://www.numpy.org/
? NumPy是Python語言的一個擴(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í)行元素級計算以及直接對數(shù)組執(zhí)行數(shù)學(xué)運(yùn)算的函數(shù)
用于讀寫硬盤上基于數(shù)組的數(shù)據(jù)集的工具
線性代數(shù)運(yùn)算鞍匾、傅里葉變換蜂林,以及隨機(jī)數(shù)生成
用于將C傀广、C++、Fortran代碼集成到Python的工具
除了為Python提供快速的數(shù)組處理能力庭砍,NumPy在數(shù)據(jù)分析方面還有另外一
個主要作用,即作為在算法之間傳遞數(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罐呼,如果輸入本身就是一個ndarray就不進(jìn)行復(fù)制。
arange類似于內(nèi)置的range侦高,但返回一個ndarray而不是列表嫉柴。
ones, ones_like根據(jù)指定形狀和dtype創(chuàng)建一個全1數(shù)組。ones_like以另一個數(shù)組為參數(shù)奉呛,并根據(jù)其形
狀和dtype創(chuàng)建一個全1數(shù)組计螺。
zeros, zeros_like類似于ones和ones_like,只不過產(chǎn)生的是全0數(shù)組而已瞧壮。
empty, empty_like創(chuàng)建數(shù)組登馒,只分配內(nèi)存空間但不填充任何值。
eye, identity創(chuàng)建一個正方的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
分別用兩個32位麦射,64位或128位浮點(diǎn)數(shù)表示的復(fù)數(shù)。
bool - ?存儲True和False值的布爾類型
object - OPython對象類型
string_ - S固定長度的字符串類型灯谣。S10代表長度為10的字符串潜秋。
unicode_ - U固定長度的unicode類型
? 創(chuàng)建ndarray時指定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)算也會將那個標(biāo)量值傳播到各個元素
例子代碼:
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)是一個NumPy術(shù)語峻呛,它指的是利用整數(shù)數(shù)組進(jìn)
行索引。
一次傳入多個索引數(shù)組會有一點(diǎn)特別辜窑。它返回的是一個一維數(shù)組钩述,其中的元素
對應(yīng)各個索引元組。
例子代碼: 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計算整數(shù)穆碎、浮點(diǎn)數(shù)或復(fù)數(shù)的絕對值切距。對于非復(fù)數(shù)值,可以使用更快的fabs惨远。
sqrt計算各元素的平方根谜悟。相當(dāng)于arr ** 0.5
sqare計算各元素的平方。相當(dāng)于arr ** 2
exp計算各元素的e^x
log, log10, log2, log1p分別為自然對數(shù)北秽、底數(shù)為10的log葡幸、底數(shù)為2的log和log(1 + x)。
sign計算各元素的正負(fù)號:1(正數(shù))贺氓、0(零)蔚叨、-1(負(fù)數(shù))。
ceil計算各元素的ceiling值辙培,即大于等于該值的最小整數(shù)蔑水。
floor計算各元素的floor值,即小于等于該值的最小整數(shù)扬蕊。
NumPy的ndarray 快速的元素級數(shù)組函數(shù)? 一元函數(shù) II
類型說明
rint將各元素值四舍五入到最接近的整數(shù)搀别,保留dtype。
modf將數(shù)組的小數(shù)部分與整數(shù)部分以兩個獨(dú)立數(shù)組的形式返還尾抑。
isnan返回一個表示“哪些值是NaN(這不是一個數(shù)字)”的布爾型數(shù)組
isfinite, isinf分別返回一個表示“哪些元素是有限的(非inf歇父,非NaN)”或“哪些元素是
無窮的”的布爾型數(shù)組
cos, cosh, sin, sinh, tan, tanh普通型或雙曲型三角函數(shù)
arccos, arccosh, arcsin, arcsinh,
arctan, arctanh
反三角函數(shù)
logical_not計算各元素not x的真值。相當(dāng)于-arr再愈。
NumPy的ndarray 快速的元素級數(shù)組函數(shù)? 二元函數(shù) I
類型說明
add將數(shù)組中對應(yīng)的元素相加
subtract從第一個數(shù)組中減去第二個數(shù)組中的元素
multiply數(shù)組元素相乘
divide, floor_divide除法或向下取整除法
power對第一個數(shù)組中的元素A和第二個數(shù)組中對應(yīng)位置的元素B榜苫,計算A^B。
maximum, fmax元素級的最大值計算翎冲。fmax將忽略NaN垂睬。
minimum, fmin元素級的最小值計算。fmin將忽略NaN。
mod元素級的求模計算
NumPy的ndarray 快速的元素級數(shù)組函數(shù)? 二元函數(shù) II
類型說明
copysign將第二個數(shù)組中的符號復(fù)制給第一個數(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)算要比等價的純Python方式快上一兩個數(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)計方法? 數(shù)學(xué)和統(tǒng)計方法
類型說明
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所有元素的累計和
cumprod所有元素的累計積
利用數(shù)組進(jìn)行數(shù)據(jù)處理 數(shù)學(xué)和統(tǒng)計方法
標(biāo)準(zhǔn)差和方差的解釋
cumsum和cumprod的解釋
帶axis參數(shù)的統(tǒng)計函數(shù)
例子代碼:
data_processing_using_arrays/mathematical_and_statistical_methods.py
利用數(shù)組進(jìn)行數(shù)據(jù)處理 用于布爾型數(shù)組的方法
? sum對True值計數(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)計算x中的唯一元素绢涡,并返回有序結(jié)果牲剃。
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ù)組中的元素。
? 例子代碼: 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計算對角線元素的和
det計算矩陣行列式
eig計算方陣的特征值和特征向量
inv計算方陣的逆
線性代數(shù)
? 常用的numpy.linalg函數(shù) II
類型說明
pinv計算矩陣的Moore-Penrose偽逆
qr計算QR分解
svd計算奇異值分解
solve解線性方程Ax = b,其中A為一個方陣戏仓。
lstsq計算Ax = b的最小二乘解
? 例子代碼: linear_algebra.py
隨機(jī)數(shù)生成
? 部分numpy.random函數(shù) I
類型說明
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)生二項分布的樣本值
隨機(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)用 花式索引的等價函數(shù)
? take
? put
? 例子代碼:advanced_array_manipulation/fancy_indexing_equivalents.py
例題分析 距離矩陣計算
給定m × n階矩陣X,滿足X = [x1, x2, ... xn]抗蠢,這里第i列向量是m維向量举哟。
求n × n矩陣,使得Dij = ||xi - xj||2
例題分析 距離矩陣計算
? 方法1:標(biāo)準(zhǔn)方法計算Dij
? D[i, j] = numpy.linalg.norm(X[:, i], X[:, j) ** 2
? 方法2:利用dot計算Dij
? d=X[:,i]-X[:,j]
? D[i, j] = numpy.dot(d, d)
例題分析 距離矩陣計算
? 方法3:減少dot調(diào)用次數(shù)
Dij = (xi - xj)T(xi - xj) = xiTxi - 2xiTxj + xjTxj
G = numpy.dot(X.T, X)? Dij =Gii -2Gij +Gjj
例題分析 距離矩陣計算
? 方法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