一呼奢、Numpy簡(jiǎn)介
Numpy是python的科學(xué)計(jì)算庫(kù),支持高級(jí)大量的維度數(shù)組與矩陣運(yùn)算本橙,此外有針對(duì)數(shù)組運(yùn)算提供了大量的數(shù)學(xué)函數(shù)庫(kù)。基本功能如下:
1脆诉、快速高效的多維數(shù)組對(duì)象ndarray甚亭;
2、用于對(duì)數(shù)組執(zhí)行元素級(jí)計(jì)算以及 直接對(duì)數(shù)組執(zhí)行數(shù)學(xué)運(yùn)算的函數(shù)击胜;
3亏狰、用于讀寫硬盤上基于數(shù)組的數(shù)據(jù)集的工具;
4偶摔、線性代數(shù)運(yùn)算暇唾、傅里葉變換,以及隨機(jī)數(shù)生成辰斋;
5信不、用于將c、c++亡呵、Fortran代碼集成到Python的工具抽活;
6、除了為Python提供快速的數(shù)組處理能力锰什,NumPy在數(shù)據(jù)分析方面還有另外一個(gè)主要作用下硕,即作為在算法之間傳遞數(shù)據(jù)的容器丁逝。
二、Numpy基礎(chǔ)
1梭姓、創(chuàng)建數(shù)組
首先來看一下numpy數(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單位矩陣 |
Numpy的ndarray數(shù)組和標(biāo)量之間的運(yùn)算
1诀艰、不用編寫循環(huán)即可對(duì)數(shù)據(jù)執(zhí)行批量運(yùn)算
2柬甥、大小相等的數(shù)組之間的任何算術(shù)運(yùn)算都會(huì)將運(yùn)算應(yīng)用到元素級(jí)
3、數(shù)組與標(biāo)量的算術(shù)運(yùn)算也會(huì)將那個(gè)標(biāo)量值傳播到各個(gè)元素
一維數(shù)組
import numpy as np
arr = np.array([[1,3,4],[5,7,9]])
print (arr * arr)
#輸出結(jié)果
[[ 1 9 16]
[25 49 81]]
print(arr - arr)
#輸出結(jié)果
[[0 0 0]
[0 0 0]]
print(1/arr)
#輸出結(jié)果
[[1. 0.33333333 0.25 ]
[0.2 0.14285714 0.11111111]]
print(arr ** 0.5)
#輸出結(jié)果
[[1. 1.73205081 2. ]
[2.23606798 2.64575131 3. ]]
二維數(shù)組
arr=np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]])
print(arr[0])
#輸出結(jié)果
[[1 2 3]
[4 5 6]]
print(arr[1,0])
#輸出結(jié)果
[7 8 9]
values=arr[0]
values
#賦值結(jié)果
array([[1, 2, 3],
[4, 5, 6]])
#同上
values=arr[0].copy()
values
array([[1, 2, 3],
[4, 5, 6]])
arr[0]=1
arr[0]
#將第一行全部賦值為1
#輸出結(jié)果
array([[1, 1, 1],
[1, 1, 1]])
arr[0]=values
arr[0]
#再賦值回來
array([[1, 2, 3],
[4, 5, 6]])
2其垄、數(shù)據(jù)切片
arr=np.array([1,2,3,4,5,6,7,8,9,10])#一維數(shù)組
arr[1:6]#前閉后開苛蒲,下標(biāo)為1-5的數(shù)據(jù)(下標(biāo)從0開始)
#輸出結(jié)果
array([2, 3, 4, 5, 6])
arr=np.array([[1,2,3],[4,5,6],[7,8,9]])#二維數(shù)組
arr[:2]#前兩行
#輸出結(jié)果
array([[1, 2, 3],
[4, 5, 6]])
arr[:2,1:]#前兩行的2、3兩列
#輸出結(jié)果
array([[2, 3],
[5, 6]])
arr[:,:1]#打印第一列的所有元素
#輸出結(jié)果
array([[1],
[4],
[7]])
arr[:2,1:]=0#前兩行的第2绿满、3列設(shè)置為0
arr
#輸出結(jié)果
array([[1, 0, 0],
[4, 0, 0],
[7, 8, 9]])
3臂外、數(shù)據(jù)索引
Numpy的ndarray布爾型索引
1、布爾型數(shù)組的長(zhǎng)度必須跟被索引的軸長(zhǎng)度一致
2棒口、可以將布爾型數(shù)組跟切片寄月、整數(shù)(或整數(shù)序列)混合使用
例如
import numpy.random as np_random
name_arr = np.array(['Bob','Joe','Eill','Eill','Joe','Joe','Bob'])
rand_arr=np_random.randn(7,4)#隨機(jī)7*4的數(shù)組
rand_arr
#輸出結(jié)果
array([[ 0.52900587, 1.70244139, -1.35744235, 1.25015313],
[ 0.23373258, 1.09742228, -1.00995459, -1.54458745],
[-0.62998363, 0.11589576, 0.13457285, 0.31126254],
[-1.01457169, -0.06292203, -0.67612224, -0.74714611],
[-1.99870067, 1.53986087, -0.38757238, -1.08902317],
[ 1.09207708, -0.64661848, -0.07324105, 0.32222022],
[-1.2301582 , 1.76768207, -1.09098274, -0.47474178]])
name_arr=='Bob'#返回布爾數(shù)組辜膝,元素等于‘Bob’為True,否則Faluse
#輸出結(jié)果
array([ True, False, False, False, False, False, True])
rand_arr[name_arr=='Bob']#利用布爾數(shù)組選擇行无牵,前提是長(zhǎng)度必須等于數(shù)組行數(shù)
#輸出結(jié)果(將符合條件的行輸出)
array([[ 0.52900587, 1.70244139, -1.35744235, 1.25015313],
[-1.2301582 , 1.76768207, -1.09098274, -0.47474178]])
rand_arr[name_arr == 'Bob',:2]#增加限制打印列的范圍
#輸出結(jié)果
array([[ 0.52900587, 1.70244139],
[-1.2301582 , 1.76768207]])
rand_arr[~(name_arr == 'Bob')]#對(duì)布爾數(shù)組的內(nèi)容取反
#輸出結(jié)果
array([[ 0.23373258, 1.09742228, -1.00995459, -1.54458745],
[-0.62998363, 0.11589576, 0.13457285, 0.31126254],
[-1.01457169, -0.06292203, -0.67612224, -0.74714611],
[-1.99870067, 1.53986087, -0.38757238, -1.08902317],
[ 1.09207708, -0.64661848, -0.07324105, 0.32222022]])
mask_arr = (name_arr == 'Bob') | (name_arr == 'Eill')
rand_arr[mask_arr]
#輸出結(jié)果
array([[ 0.52900587, 1.70244139, -1.35744235, 1.25015313],
[-0.62998363, 0.11589576, 0.13457285, 0.31126254],
[-1.01457169, -0.06292203, -0.67612224, -0.74714611],
[-1.2301582 , 1.76768207, -1.09098274, -0.47474178]])
rand_arr[name_arr !='Joe']=7
rand_arr
#輸出結(jié)果
array([[ 7. , 7. , 7. , 7. ],
[ 0.23373258, 1.09742228, -1.00995459, -1.54458745],
[ 7. , 7. , 7. , 7. ],
[ 7. , 7. , 7. , 7. ],
[-1.99870067, 1.53986087, -0.38757238, -1.08902317],
[ 1.09207708, -0.64661848, -0.07324105, 0.32222022],
[ 7. , 7. , 7. , 7. ]])
Numpy的ndarray花式索引
1、花式索引是一個(gè)NumPy術(shù)語(yǔ)厂抖,它指的是利用整數(shù)數(shù)組進(jìn)行索引
2茎毁、一次傳入多個(gè)索引數(shù)組會(huì)有一點(diǎn)特別。它返回的是一個(gè)一維數(shù)組忱辅,其中的元素對(duì)應(yīng)各個(gè)索引元組
import numpy as np
arr=np.empty((8,4))#empty創(chuàng)建的數(shù)組中七蜘,包含的均是無(wú)意義的數(shù)值
arr
#輸出結(jié)果
array([[6.23060065e-307, 8.90104239e-307, 1.89150801e-307,
1.50202247e-307],
[3.56043053e-307, 7.56595733e-307, 3.56043054e-307,
7.56595733e-307],
[1.00131040e-307, 8.34426464e-308, 6.23038675e-307,
1.50201822e-307],
[3.56043053e-307, 1.60219306e-306, 2.44763557e-307,
1.69119330e-306],
[4.22805115e-307, 3.22651328e-307, 3.11524091e-307,
1.60219035e-306],
[4.45063154e-308, 6.23039354e-307, 2.33422937e-312,
2.67023123e-307],
[1.61324985e-307, 3.22649121e-307, 5.34041153e-307,
2.00264456e-307],
[8.34427737e-308, 1.50198257e-307, 4.22786442e-307,
2.00271247e-307]])
for i in range(8):
arr[i]=i
arr
#輸出結(jié)果
array([[0., 0., 0., 0.],
[1., 1., 1., 1.],
[2., 2., 2., 2.],
[3., 3., 3., 3.],
[4., 4., 4., 4.],
[5., 5., 5., 5.],
[6., 6., 6., 6.],
[7., 7., 7., 7.]])
print(arr[[4,3,0,6]])
#輸出結(jié)果
[[4. 4. 4. 4.]
[3. 3. 3. 3.]
[0. 0. 0. 0.]
[6. 6. 6. 6.]]
print(arr[[-3,-5,-7]])
#輸出結(jié)果
[[5. 5. 5. 5.]
[3. 3. 3. 3.]
[1. 1. 1. 1.]]
arr=np.arange(32).reshape((8,4))#依次生成32個(gè)自然數(shù),并且以8行4列的數(shù)組形式顯示:
arr
#輸出結(jié)果
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23],
[24, 25, 26, 27],
[28, 29, 30, 31]])
print(arr[[1,5,7,2],[0,3,1,2]])#自動(dòng)匹配(1,0),(5,3),(7,1),(2,2)
#數(shù)據(jù)結(jié)果
[ 4 23 29 10]
print(arr[[1,5,7,2]][:,[0,3,1,2]])#1墙懂、5橡卤、7、2行的0损搬、3碧库、1柜与、2列
#輸出結(jié)果
[[ 4 7 5 6]
[20 23 21 22]
[28 31 29 30]
[ 8 11 9 10]]
print(arr[np.ix_([1,5,7,2],[0,3,1,2])])#可讀性更好的寫法
#能把兩個(gè)一維數(shù)組 轉(zhuǎn)換為 一個(gè)用于選取方形區(qū)域的索引器
#直接往np.ix_()里扔進(jìn)兩個(gè)一維數(shù)組[1,5,7,2],[0,3,1,2]嵌灰,就能先按我們要求選取行弄匕,再按順序?qū)⒘信判颍厦娴玫降慕Y(jié)果一樣
#輸出結(jié)果
[[ 4 7 5 6]
[20 23 21 22]
[28 31 29 30]
[ 8 11 9 10]]
4沽瞭、NumPy的ndarray數(shù)組轉(zhuǎn)置和軸對(duì)換
import numpy as np
import numpy.random as np_random
print ('轉(zhuǎn)置矩陣')
arr=np.arange(15).reshape((3,5))#生成順序數(shù)組迁匠,后整形為3行5列
print (arr)
#輸出結(jié)果
轉(zhuǎn)置矩陣
[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]]
print(arr.T)
#輸出結(jié)果
[[ 0 5 10]
[ 1 6 11]
[ 2 7 12]
[ 3 8 13]
[ 4 9 14]]
print('轉(zhuǎn)置矩陣做點(diǎn)積')
arr = np_random.randn(6,3)
print(arr)
#輸出結(jié)果
[[ 0.86578763 0.645244 -0.49405087]
[ 0.27238488 -0.40718433 -0.02145935]
[-1.96089557 -0.06565915 -0.09322006]
[ 0.73279045 -0.7511035 0.29078194]
[ 2.18427138 -0.86903329 0.57696171]
[-0.67968328 1.25416114 -0.05842028]]
print(np.dot(arr.T,arr))
#輸出結(jié)果
轉(zhuǎn)置矩陣做點(diǎn)積
[[10.43888587 -2.72455423 1.26223693]
[-2.72455423 3.4787455 -1.0969994 ]
[ 1.26223693 -1.0969994 0.67408863]]
print('高維矩陣轉(zhuǎn)換')
arr=np.arange(16).reshape((2,2,4))
arr_copy=arr.copy()
print(arr)
#輸出結(jié)果
[[[ 0 1 2 3]
[ 4 5 6 7]]
[[ 8 9 10 11]
[12 13 14 15]]]
print(arr[0])
#輸出結(jié)果
[[0 1 2 3]
[4 5 6 7]]
print(arr[0][0])
#輸出結(jié)果
[0 1 2 3]
print(arr[0][0][1])
#輸出結(jié)果
1
print(arr.transpose(1,0,2))#transpose的參數(shù)為坐標(biāo),現(xiàn)在傳入為(1,0,2)代表a[x][y][z]=a[y][x][z]
#輸出結(jié)果
[[[ 0 1 2 3]
[ 8 9 10 11]]
[[ 4 5 6 7]
[12 13 14 15]]]
print(arr_copy)
#輸出結(jié)果
print(arr_copy)
print(arr_copy)
[[[ 0 1 2 3]
[ 4 5 6 7]]
[[ 8 9 10 11]
[12 13 14 15]]]
print(arr_copy.transpose(0,2,1))
#輸出結(jié)果
[[[ 0 4]
[ 1 5]
[ 2 6]
[ 3 7]]
[[ 8 12]
[ 9 13]
[10 14]
[11 15]]]
5驹溃、NumPy的ndarray快速的元素級(jí)數(shù)組函數(shù)
一元函數(shù)
類型 | 說明 |
---|---|
abs,fabs | 計(jì)算整數(shù)城丧,浮點(diǎn)數(shù)或復(fù)數(shù)的絕對(duì)值。對(duì)于非復(fù)數(shù)值吠架,可以使用更快的fabs |
sqrt | 計(jì)算各元素的平方根芙贫。相當(dāng)于arr**0.5 |
sqare | 計(jì)算各元素的平方。相當(dāng)于arr**2 |
exp | 計(jì)算各元素的e^x |
log,log10,log2,log1p | 分別為自然對(duì)數(shù)傍药、底數(shù)為10的log磺平、底數(shù)為2的log和log(1+x) |
sign | 計(jì)算各元素的正負(fù)號(hào):1(正數(shù))、0(零)拐辽、-1(負(fù)數(shù)) |
ceil | 計(jì)算各元素的ceiling值拣挪,即大于等于該值得最小整數(shù) |
floor | 計(jì)算各元素的floor值,即小于等于該值得最大整數(shù) |
rint | 將各元素值四舍五入到最接近的整數(shù)俱诸,保留dtype |
modf | 將數(shù)組的小數(shù)部分與整數(shù)部分以兩個(gè)獨(dú)立數(shù)組的形式返還 |
isnan | 返回一個(gè)表示“哪些值是NaN(這不是一個(gè)數(shù)字)”的布爾型數(shù)組 |
isfinite,isinf | 分別返回一個(gè)表示“哪些元素是有限的(非inf,非NaN)”或“哪些元素是無(wú)窮的”的布爾型數(shù)組 |
cos,cosh,sin,sinh,tan,tanh | 普通型或雙曲型三角函數(shù) |
arccos,arccosh,arcsin,arcsinh,arctan,arctanh | 反三角函數(shù) |
logical_not | 計(jì)算各元素not x的真值菠劝。相當(dāng)于-arr |
二元函數(shù)
類型 | 說明 |
---|---|
add | 將數(shù)組中對(duì)應(yīng)的元素相加 |
subtract | 從第一個(gè)數(shù)組中減去第二個(gè)數(shù)組中的元素 |
multiply | 數(shù)組元素相乘 |
divide,floor_divide | 除法或向下取整除法 |
power | 對(duì)第一個(gè)數(shù)組中的元素A和第二個(gè)數(shù)組中對(duì)應(yīng)位置的元素B,計(jì)算A^B |
maximum睁搭,fmax | 元素級(jí)的最大值計(jì)算赶诊。fmax將忽略NaN |
minimum,fmin | 元素級(jí)的最小值計(jì)算。fmin將忽略NaN |
mod | 元素級(jí)的求模計(jì)算 |
copysign | 將第二個(gè)數(shù)組中的符號(hào)復(fù)制給第一個(gè)數(shù)組中的值 |
greater园骆,greater_equal,less,less_equal,equal,not_equal | 執(zhí)行元素級(jí)的比較舔痪,最終產(chǎn)生布爾型數(shù)組 |
logical_and,logical_or,logical_xor | 執(zhí)行元素級(jí)的真值邏輯運(yùn)算,最終產(chǎn)生布爾型數(shù)組 |
舉例說明
import numpy as np
import numpy.random as np_random
print('求平方根')
arr=np.arange(10)
print(np.sqrt(arr))
#輸出結(jié)果
求平方根
[0. 1. 1.41421356 1.73205081 2. 2.23606798 2.44948974 2.64575131 2.82842712 3. ]
print('數(shù)組比較')
x=np_random.randn(8)#標(biāo)準(zhǔn)正態(tài)分布中返回一個(gè)或多個(gè)樣本值,numpy.random.rand(d0, d1, …, dn)的隨機(jī)樣本位于[0, 1)中锌唾。
y=np_random.randn(8)
print(x)
print(y)
print (np.maximum(x,y))
#輸出結(jié)果
數(shù)組比較
[ 9.52102078e-01 -5.50715978e-01 -2.88311757e-02 -6.73292894e-01
1.49144587e+00 -4.29510384e-01 -4.29998122e-01 -1.36136122e-03]
[ 2.13373561 2.06364166 0.61558615 -0.59547026 1.31034061 0.17616641
0.28403327 -0.26767038]
[ 2.13373561e+00 2.06364166e+00 6.15586151e-01 -5.95470255e-01
1.49144587e+00 1.76166407e-01 2.84033273e-01 -1.36136122e-03]
print('使用modf函數(shù)把浮點(diǎn)數(shù)分解成整數(shù)和小數(shù)部分')
arr=np_random.randn(7) * 5 #統(tǒng)一乘5
print(np.modf(arr))
#輸出結(jié)果
使用modf函數(shù)把浮點(diǎn)數(shù)分解成整數(shù)和小數(shù)部分
(array([-0.82838311, -0.71882546, -0.41527595, -0.21803734, -0.99155683,
0.75074988, -0.35514585]), array([ -4., -1., -11., -3., -1., 1., -3.]))
6锄码、利用數(shù)組進(jìn)行數(shù)據(jù)處理
NumPy數(shù)組使你可以將許多種數(shù)據(jù)處理任務(wù)表述為簡(jiǎn)潔的數(shù)組表達(dá)式(否則需要編寫循環(huán))。將數(shù)組表達(dá)式代替循環(huán)的做法晌涕,通常被稱為矢量化滋捶。矢量化數(shù)組運(yùn)算要比等價(jià)的純Python方式快上一兩個(gè)數(shù)量級(jí)
print('通過真值表選擇元素')
x_arr=np.array([1.1,1.2,1.3,1.4,1.5])
y_arr=np.array([2.1,2.2,2.3,2.4,2.5])
cond=np.array([True,False,True,True,False])
result=[(x if c else y) for x,y,c in zip(x_arr,y_arr,cond)]
print(result)
#輸出結(jié)果
通過真值表選擇元素
[1.1, 2.2, 1.3, 1.4, 2.5]
print(np.where(cond,x_arr,y_arr))
#輸出結(jié)果
[1.1 2.2 1.3 1.4 2.5]
arr=np_random.randn(4,4)
print(arr)
print(np.where(arr>0,2,-2))
print(np.where(arr >0,2,arr))
#輸出結(jié)果
[[-1.17689271 1.22467723 0.43345675 -0.72233803]
[-0.63662559 0.47394752 -0.78281055 0.7745087 ]
[ 0.34016053 1.2149215 -0.44530653 -2.02560303]
[ 0.42546874 1.21322415 -0.86223039 0.86367628]]
[[-2 2 2 -2]
[-2 2 -2 2]
[ 2 2 -2 -2]
[ 2 2 -2 2]]
[[-1.17689271 2. 2. -0.72233803]
[-0.63662559 2. -0.78281055 2. ]
[ 2. 2. -0.44530653 -2.02560303]
[ 2. 2. -0.86223039 2. ]]
cond_1=np.array([True,False,True,True,False])
cond_2=np.array([False,True,False,True,False])
# 傳統(tǒng)代碼
result=[]
for i in range(len(cond)):
if cond_1[i] and cond_2[i]: # 如果同時(shí)滿足,就不在往下走
result.append(0)
elif cond_1[i]:
result.append(1)
elif cond_2[i]:
result.append(2)
else:
result.append(3)
print(result)
#輸出結(jié)果
[1, 2, 1, 0, 3]
result = np.where(cond_1 & cond_2,0,np.where(cond_1,1,np.where(cond_2,2,3)))
print(result)
[1 2 1 0 3]
7余黎、利用數(shù)組進(jìn)行數(shù)據(jù)處理——數(shù)學(xué)和統(tǒng)計(jì)方法
類型 | 說明 |
---|---|
sum | 對(duì)數(shù)組中全部或某軸向的元素求和重窟。零長(zhǎng)度的數(shù)組的sum為0 |
mean | 算術(shù)平均數(shù),零長(zhǎng)度的數(shù)組的mean為NaN |
std,var | 分別為標(biāo)準(zhǔn)差和方差惧财,自由度可調(diào)(默認(rèn)為n) |
min,max | 最大值和最小值 |
argmin | 分別為最大值和最小值的索引 |
cumsum | 所有元素的累計(jì)和 |
cumprod | 所有元素的累計(jì)積 |
import numpy as np
import numpy.random as np_random
print('求和巡扇,求平均')
arr=np.random.randn(5,4)
print(arr)
print(arr.mean())
print(arr.sum())
print(arr.mean(axis=1))#對(duì)每一行的元素求平均值
print(arr.sum(0))#對(duì)每一列元素求和炒考,axis可以省略
#輸出結(jié)果
求和,求平均
[[ 1.1920312 0.59548133 -1.69638354 -0.86765064]
[ 0.48965205 1.21543697 -0.46861947 0.15786849]
[ 0.46646589 -1.07657886 0.34960628 -0.64421778]
[ 0.75182741 0.88173646 -2.1914321 0.53707905]
[ 0.2316153 1.01686933 1.52000011 -2.31109877]]
0.00748443502551317
0.1496887005102634
[-0.19413041 0.34858451 -0.22618112 -0.0051973 0.11434649]
[ 3.13159185 2.63294523 -2.48682873 -3.12801965]
print('cumsum和cumprod函數(shù)演示')
arr=np.array([[0,1,2],[3,4,5],[6,7,8]])
print(arr.cumsum(0))# 按列求和
print(arr.cumprod(1))# 按行求積
print(arr.cumprod(0))# 按列求積
#輸出結(jié)果
cumsum和cumprod函數(shù)演示
[[ 0 1 2]
[ 3 5 7]
[ 9 12 15]]
[[ 0 0 0]
[ 3 12 60]
[ 6 42 336]]
[[ 0 1 2]
[ 0 4 10]
[ 0 28 80]]
print('對(duì)正數(shù)求和')
arr=np_random.randn(100)
print((arr > 0).sum())
#輸出結(jié)果
對(duì)正數(shù)求和
42
print('對(duì)數(shù)組邏輯操作')
bools=np.array([False,False,True,False])
print(bools.any())# 有一個(gè)為True則返回True
print(bools.all())# 有一個(gè)為False則返回False
#輸出結(jié)果
對(duì)數(shù)組邏輯操作
True
False
8霎迫、利用數(shù)組進(jìn)行數(shù)據(jù)處理——排序
import numpy as np
import numpy.random as np_random
print('一維數(shù)組排序')
arr=np_random.randn(8)
arr.sort()
print(arr)
一維數(shù)組排序
[-1.93454221 -1.6182566 -0.77200267 -0.688614 -0.63448136 -0.6169222
-0.18656019 0.26607257]
print('二維數(shù)組排序')
arr=np_random.randn(5,3)
arr.sort(1) # 對(duì)每一行元素做排序
print(arr)
#輸出結(jié)果
二維數(shù)組排序
[[-0.25145057 -0.01089318 0.19817363]
[-1.46680866 0.08178992 1.49258159]
[ 0.65733633 1.59214515 2.81517738]
[ 0.30385335 0.78703474 1.23996363]
[-0.82907411 -0.32716698 2.83399797]]
print('找位置在5%的數(shù)字')
large_arr=np_random.randn(1000)
large_arr.sort()
print(large_arr[int(0.05 * len(large_arr))])
#輸出結(jié)果
找位置在5%的數(shù)字
-1.6407082885132667
9斋枢、利用數(shù)組進(jìn)行數(shù)據(jù)處理——去重以及其他集合運(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ù)組中的元素 |
例如
import numpy as np
import numpy.random as np_random
print('用unique函數(shù)去重')
names=np.array(['Bob','Joe','Will','Bob','Will','Joe','Joe'])
print(sorted(set(names))) #傳統(tǒng)python做法
print(np.unique(names))
ints=np.array([3,3,3,2,2,1,1,4,4])
print(np.unique(ints))
#輸出結(jié)果
用unique函數(shù)去重
['Bob', 'Joe', 'Will']
['Bob' 'Joe' 'Will']
[1 2 3 4]
print('查找數(shù)組元素是否在另一個(gè)數(shù)組')
values=np.array([6,0,0,3,2,5,6])
print(np.in1d(values,[2,3,6]))#中間的是數(shù)字1
#輸出結(jié)果
查找數(shù)組元素是否在另一個(gè)數(shù)組
[ True False False True True False True]
10戈次、用于數(shù)組的文件的輸入輸出
NumPy能夠讀寫磁盤上的文本數(shù)據(jù)或二進(jìn)制數(shù)據(jù)
1、將數(shù)組以二進(jìn)制格式保存到磁盤
np.save和np.load是讀寫磁盤數(shù)組數(shù)據(jù)的兩個(gè)主要函數(shù)筒扒。默認(rèn)情況下怯邪,數(shù)組使以未壓縮的原始二進(jìn)制格式保存在擴(kuò)展名為.npy的文件中的。
arr=np.arange(10)
np.save('E:\some_array',arr)#如果文件路徑末尾沒有擴(kuò)展名.npy花墩,則該擴(kuò)展名會(huì)被自動(dòng)加上
np.load('E:\some_array.npy')
#輸出結(jié)果
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
通過np.savez可以將多個(gè)數(shù)組保存到一個(gè)壓縮文件中悬秉,將數(shù)組以關(guān)鍵字參數(shù)的形式傳入即可:
# 數(shù)組可以用關(guān)鍵字參數(shù),關(guān)鍵字可以做為加載字典的key冰蘑,不寫的話和泌,key為數(shù)組名_索引號(hào)
np.savez('some_array_achive.zip',arr,arr)
#加載npz文件時(shí),會(huì)得到一個(gè)類似字典的對(duì)象祠肥,該對(duì)象會(huì)對(duì)各個(gè)數(shù)組進(jìn)行延遲加載
arch=np.load("some_array_achive.zip.npz")
arch['arr_0']
#輸出結(jié)果
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
np.savez('some_array_archive.npz',a=arr,b=arr)
arch=np.load('some_array_archive.npz')
arch['b']
#輸出結(jié)果
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
2武氓、存取文本文件
函數(shù)為savetxt和loadtxt,delimiter用于指定分隔符仇箱。
arr=np.arange(15).reshape(3,5)
np.savetxt('E:\\number.txt',arr)#默認(rèn)是以空格存儲(chǔ)
np.loadtxt('E:\\number.txt',delimiter=' ')
#輸出結(jié)果
array([[ 0., 1., 2., 3., 4.],
[ 5., 6., 7., 8., 9.],
[10., 11., 12., 13., 14.]])
arr=np.arange(15).reshape(3,5)
np.savetxt('E:\\number.txt',arr,fmt="%d", delimiter=",")##改為保存為整數(shù)县恕,以逗號(hào)分隔
np.loadtxt('E:\\number.txt',delimiter=',')#讀入時(shí)也需要指定逗號(hào)分隔
#輸出結(jié)果
array([[ 0., 1., 2., 3., 4.],
[ 5., 6., 7., 8., 9.],
[10., 11., 12., 13., 14.]])
11、線性代數(shù)相關(guān)知識(shí)
1剂桥、常用的numpy.linalg函數(shù)
類型 | 說明 |
---|---|
diag | 以一維數(shù)組的形式返回方陣的對(duì)角線(或非對(duì)角線元素)忠烛,或?qū)⒁痪S數(shù)組轉(zhuǎn)換為方陣(非對(duì)角線元素為0) |
dot | 矩陣乘法 |
trace | 計(jì)算對(duì)角線元素的和 |
det | 計(jì)算矩陣行列式 |
eig | 計(jì)算方陣的特征值和特征向量 |
inv | 計(jì)算方陣的逆 |
pinv | 計(jì)算矩陣的Moore-Penrose偽逆 |
qr | 計(jì)算QR分解 |
svd | 計(jì)算奇異值分解 |
solve | 解線性方程Ax=b,其中A為一個(gè)方陣 |
lstsq | 計(jì)算Ax=b的最小二乘法 |
2、隨機(jī)數(shù)生成
部分numpy.random函數(shù)
類型 | 說明 |
---|---|
seed | 確定隨機(jī)數(shù)生成器的種子 |
permutation | 返回一個(gè)序列的隨機(jī)排列或返回一個(gè)隨機(jī)排列的返回 |
shuffle | 對(duì)一個(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)分布的樣本值 |
normal | 產(chǎn)生正態(tài)(高斯)分布的樣本值 |
beta | 產(chǎn)生Beta分布的樣本值 |
chisquare | 產(chǎn)生卡方分布的樣本值 |
gamma | 產(chǎn)生Gamma分布的樣本值 |
uniform | 產(chǎn)生在[0,1]中均勻分布的樣本值 |
舉例說明一下:
import numpy as np
import numpy.random as np_random
from numpy.linalg import inv,qr #np.linalg.qr() 計(jì)算矩陣的QR分解况木。把矩陣A作為QR垒拢,q是正交的旬迹,r是上三角形。
print('矩陣乘法')
x=np.array([[1,2,3],[4,5,6]])
y=np.array([[6,23],[-1,7],[8,9]])
print(x.dot(y))
print(np.dot(x,np.ones(3)))
#輸出結(jié)果
矩陣乘法
[[ 28 64]
[ 67 181]]
[ 6. 15.]
print('矩陣求逆')
x=np_random.randn(5,5)
mat=x.T.dot(x)
print(mat)
print(inv(mat)) #矩陣求逆
#輸出結(jié)果
矩陣求逆
[[ 1.98865642 0.87621711 0.50914973 -0.59201157 1.4962339 ]
[ 0.87621711 3.21679405 -2.71081078 -2.47261804 3.30593938]
[ 0.50914973 -2.71081078 3.95085603 1.98369356 -3.06847868]
[-0.59201157 -2.47261804 1.98369356 2.28325811 -1.90019395]
[ 1.4962339 3.30593938 -3.06847868 -1.90019395 5.32927538]]
[[ 2.51522146 0.5094521 -2.05939265 1.64310943 -1.62208792]
[ 0.5094521 8.5351535 0.03408685 6.87711283 -2.96597858]
[-2.05939265 0.03408685 2.30160136 -1.32271445 1.4106317 ]
[ 1.64310943 6.87711283 -1.32271445 6.95687878 -3.00849462]
[-1.62208792 -2.96597858 1.4106317 -3.00849462 2.22246694]]
print('矩陣消元')
print(mat)
q,r=qr(mat)
print(q)
print(r)
#輸出結(jié)果
矩陣消元
[[ 1.98865642 0.87621711 0.50914973 -0.59201157 1.4962339 ]
[ 0.87621711 3.21679405 -2.71081078 -2.47261804 3.30593938]
[ 0.50914973 -2.71081078 3.95085603 1.98369356 -3.06847868]
[-0.59201157 -2.47261804 1.98369356 2.28325811 -1.90019395]
[ 1.4962339 3.30593938 -3.06847868 -1.90019395 5.32927538]]
[[-0.7227447 0.33998332 0.10879741 0.50419857 -0.30983603]
[-0.3184468 -0.43592479 -0.4689645 -0.4094794 -0.56653343]
[-0.18504216 0.69437513 -0.43057462 -0.47498117 0.26944565]
[ 0.21515694 0.35644137 0.57379943 -0.40888083 -0.57465444]
[-0.54378178 -0.29184524 0.5035823 -0.43048784 0.4245148 ]]
[[-2.75153372 -3.4857553 1.85957706 2.37275326 -4.8731658 ]
[ 0. -4.83286671 5.70077957 3.62243914 -5.29575305]
[ 0. 0. -0.78145947 0.59426082 1.52702576]
[ 0. 0. 0. -0.3437924 -0.65908086]
[ 0. 0. 0. 0. 0.19101063]]
三求类、NumPy高級(jí)應(yīng)用
1奔垦、數(shù)組重塑
import numpy as np
print('將一位數(shù)組轉(zhuǎn)化為二維數(shù)組')
arr=np.arange(8)
print(arr)
print(arr.reshape((4,2)))
print(arr.reshape((4,2)).reshape((2,4))) #支持鏈?zhǔn)讲僮?#輸出結(jié)果
將一位數(shù)組轉(zhuǎn)化為二維數(shù)組
[0 1 2 3 4 5 6 7]
[[0 1]
[2 3]
[4 5]
[6 7]]
[[0 1 2 3]
[4 5 6 7]]
print('緯度大小自動(dòng)推導(dǎo)')
arr=np.arange(15)
print(arr.reshape((5,-1)))
#輸出結(jié)果
緯度大小自動(dòng)推導(dǎo)
[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]
[12 13 14]]
print('獲取維度信息并應(yīng)用')
other_arr=np.ones((3,5))
print(other_arr.shape)
print(arr.reshape(other_arr.shape))
#輸出結(jié)果
獲取維度信息并應(yīng)用
(3, 5)
[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]]
print('高維數(shù)組拉平')
arr=np.arange(15).reshape((5,3))
print(arr.ravel())
#輸出結(jié)果
高維數(shù)組拉平
[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14]
2、數(shù)組的合并和拆分
數(shù)組連接函數(shù)
類型 | 說明 |
---|---|
concatenate | 最一般化的連接尸疆,沿一條軸連接一組數(shù)組 |
vstack,row_stack | 以面向行的方式對(duì)數(shù)組進(jìn)行堆疊(沿軸0) |
hstack | 以面向行的方式對(duì)數(shù)組進(jìn)行堆疊(沿軸1) |
column_stack | 類似于hstack椿猎,但是會(huì)先將一維數(shù)組轉(zhuǎn)換為二維列向量 |
dstack | 以面向“深度”的方式對(duì)數(shù)組進(jìn)行堆疊(沿軸2) |
split | 沿指定軸在指定的位置拆分?jǐn)?shù)組 |
hsplit,vsplit,dsplit | split的便捷化函數(shù)惶岭,分別沿著軸0、軸1和軸2進(jìn)行拆分 |
舉例說明
import numpy as np
import numpy.random as np_random
print('連接兩個(gè)二維數(shù)組')
arr1=np.array([[1,2,3],[4,5,6]])
arr2=np.array([[7,8,9],[10,11,12]])
print(np.concatenate([arr1,arr2],axis=0)) #按行連接
print(np.concatenate([arr1,arr2],axis=1)) #按列連接
#輸出結(jié)果
連接兩個(gè)二維數(shù)組
[[ 1 2 3]
[ 4 5 6]
[ 7 8 9]
[10 11 12]]
[[ 1 2 3 7 8 9]
[ 4 5 6 10 11 12]]
#所謂堆疊犯眠,可以參考疊盤子...連接的另一種表述
print('垂直stack與水平stack')
print(np.vstack((arr1,arr2))) #垂直堆疊
print(np.hstack((arr1,arr2))) #水平堆疊
#輸出結(jié)果
垂直stack與水平stack
[[ 1 2 3]
[ 4 5 6]
[ 7 8 9]
[10 11 12]]
[[ 1 2 3 7 8 9]
[ 4 5 6 10 11 12]]
print('拆分?jǐn)?shù)組')
arr=np_random.randn(5,5)
print('水平拆分')
#split() 默認(rèn)沿著軸 0 分裂按灶,其第二個(gè)參數(shù) [1, 3] 相當(dāng)于是個(gè)切片操作,將數(shù)組分成三部分:
#第一部分 - :1 (即第 1 行)
#第二部分 - 1:3 (即第 2 到 3 行)
#第二部分 - 3: (即第 4 到 5 行)
first,second,third=np.split(arr,[1,3],axis=0)
print('first')
print(first)
print('second')
print(second)
print('third')
print(third)
#輸出結(jié)果
拆分?jǐn)?shù)組
水平拆分
first
[[-0.46491171 -0.19058384 -1.07364092 -1.85470984 0.25540176]]
second
[[ 1.74812413 -1.68223681 -0.36129552 -0.55700583 -0.07995627]
[ 0.23844452 -0.4824581 -0.80981716 -2.03862077 0.80593082]]
third
[[-0.46856153 -0.65257412 1.56297046 -0.88790314 0.9681378 ]
[ 0.39970154 -0.02626426 -0.49439246 0.33935688 1.11579582]]
print('垂直拆分')
first,second,third=np.split(arr,[1,3],axis=1)
print('first')
print(first)
print('second')
print(second)
print('third')
print(third)
#輸出結(jié)果
垂直拆分
first
[[-0.46491171]
[ 1.74812413]
[ 0.23844452]
[-0.46856153]
[ 0.39970154]]
second
[[-0.19058384 -1.07364092]
[-1.68223681 -0.36129552]
[-0.4824581 -0.80981716]
[-0.65257412 1.56297046]
[-0.02626426 -0.49439246]]
third
[[-1.85470984 0.25540176]
[-0.55700583 -0.07995627]
[-2.03862077 0.80593082]
[-0.88790314 0.9681378 ]
[ 0.33935688 1.11579582]]
3筐咧、元素的重復(fù)操作
import numpy as np
import numpy.random as np_random
print('Repeat:按元素')
arr=np.arange(3)
print(arr.repeat(3))
print(arr.repeat([2,3,4])) #3個(gè)元素鸯旁,分別復(fù)制2,3,4次,長(zhǎng)度要匹配
#輸出結(jié)果
Repeat:按元素
[0 0 0 1 1 1 2 2 2]
[0 0 1 1 1 2 2 2 2]
print('Repeat:指定軸')
arr=np_random.randn(2,2)
print(arr)
print(arr.repeat(2,axis=0))#按行repeat
print(arr.repeat(2,axis=1))#按列repeat
#輸出結(jié)果
Repeat:指定軸
[[1.50330034 0.35285254]
[0.22505996 1.09992342]]
[[1.50330034 0.35285254]
[1.50330034 0.35285254]
[0.22505996 1.09992342]
[0.22505996 1.09992342]]
[[1.50330034 1.50330034 0.35285254 0.35285254]
[0.22505996 0.22505996 1.09992342 1.09992342]]
print('Tile:參考貼瓷磚')
print(np.tile(arr,2))
print(np.tile(arr,(2,3)))#指定每個(gè)軸的tile次數(shù)
#輸出結(jié)果
Tile:參考貼瓷磚
[[1.50330034 0.35285254 1.50330034 0.35285254]
[0.22505996 1.09992342 0.22505996 1.09992342]]
[[1.50330034 0.35285254 1.50330034 0.35285254 1.50330034 0.35285254]
[0.22505996 1.09992342 0.22505996 1.09992342 0.22505996 1.09992342]
[1.50330034 0.35285254 1.50330034 0.35285254 1.50330034 0.35285254]
[0.22505996 1.09992342 0.22505996 1.09992342 0.22505996 1.09992342]]
4量蕊、花式索引的等價(jià)函數(shù)
1铺罢、take
2、put
import numpy as np
import numpy.random as np_random
print('Fancy Indexing 例子代碼')
arr=np.arange(10)*100
print(arr)
inds=[7,1,2,6]
print(arr[inds])
#輸出結(jié)果
Fancy Indexing 例子代碼
[ 0 100 200 300 400 500 600 700 800 900]
[700 100 200 600]
print('使用take')
print(arr.take(inds))
#輸出結(jié)果
使用take
[700 100 200 600]
print('使用put更新內(nèi)容')
arr.put(inds,50)
print(arr)
#輸出結(jié)果
使用put更新內(nèi)容
[ 0 50 50 300 400 500 50 50 800 900]
arr.put(inds,[70,10,20,60])
print(arr)
#輸出結(jié)果
[ 0 10 20 300 400 500 60 70 800 900]
Numpy的學(xué)習(xí)就到這里残炮,以上的代碼都是在jupyter上面實(shí)現(xiàn)的韭赘,希望大家都可以敲一敲,接下來更新的是關(guān)于Pandas庫(kù)的學(xué)習(xí)势就。