陣列---numpy
向量是一維陣列、矩陣是二維陣列
numpy可以作為數學運算的一種工具
import numpy as np就可以使用
1.如何建立陣列
import numpy as np np.array([0,1,3,2],dtype="float64") #建立一維陣列
np.array(([0,1,3,2],[0,2,3,4]),dtype="float64") #建立二維陣列
註釋:
>>> np.zeros((3,4),dtype='float64') #(3,4)是指有3行,4列的二維陣列 array([[0., 0., 0., 0.], [0., 0., 0., 0.], [0., 0., 0., 0.]])
>>> np.full((3,4,5),3.1,dtype="float64") #表示3個4行5列的全是3.1的三維陣列 array([[[3.1, 3.1, 3.1, 3.1, 3.1], [3.1, 3.1, 3.1, 3.1, 3.1], [3.1, 3.1, 3.1, 3.1, 3.1], [3.1, 3.1, 3.1, 3.1, 3.1]], [[3.1, 3.1, 3.1, 3.1, 3.1], [3.1, 3.1, 3.1, 3.1, 3.1], [3.1, 3.1, 3.1, 3.1, 3.1], [3.1, 3.1, 3.1, 3.1, 3.1]], [[3.1, 3.1, 3.1, 3.1, 3.1], [3.1, 3.1, 3.1, 3.1, 3.1], [3.1, 3.1, 3.1, 3.1, 3.1], [3.1, 3.1, 3.1, 3.1, 3.1]]])
>>> np.arange(1,10,1) #生成一維陣列
array([1, 2, 3, 4, 5, 6, 7, 8, 9])
其中,(1,10,1)表示(開始,結束,欄位長)
與list(arange(1,10,1))區別是,list中不能使用浮點數作為欄位長,而陣列可以
>>> np.linspace(1,10,100) #將1-10區間劃分100份 array([ 1. , 1.09090909, 1.18181818, 1.27272727, 1.36363636, 1.45454545, 1.54545455, 1.63636364, 1.72727273, 1.81818182, 1.90909091, 2. , 2.09090909, 2.18181818, 2.27272727, 2.36363636, 2.45454545, 2.54545455, 2.63636364, 2.72727273, 2.81818182, 2.90909091, 3. , 3.09090909, 3.18181818, 3.27272727, 3.36363636, 3.45454545, 3.54545455, 3.63636364, 3.72727273, 3.81818182, 3.90909091, 4. , 4.09090909, 4.18181818, 4.27272727, 4.36363636, 4.45454545, 4.54545455, 4.63636364, 4.72727273, 4.81818182, 4.90909091, 5. , 5.09090909, 5.18181818, 5.27272727, 5.36363636, 5.45454545, 5.54545455, 5.63636364, 5.72727273, 5.81818182, 5.90909091, 6. , 6.09090909, 6.18181818, 6.27272727, 6.36363636, 6.45454545, 6.54545455, 6.63636364, 6.72727273, 6.81818182, 6.90909091, 7. , 7.09090909, 7.18181818, 7.27272727, 7.36363636, 7.45454545, 7.54545455, 7.63636364, 7.72727273, 7.81818182, 7.90909091, 8. , 8.09090909, 8.18181818, 8.27272727, 8.36363636, 8.45454545, 8.54545455, 8.63636364, 8.72727273, 8.81818182, 8.90909091, 9. , 9.09090909, 9.18181818, 9.27272727, 9.36363636, 9.45454545, 9.54545455, 9.63636364, 9.72727273, 9.81818182, 9.90909091, 10. ])
>>> (10-1)*np.random.random((3,3))+1 區間1-10左閉右開的3行3列隨機均勻陣列。機器更改了,圖片的行不通
array([[5.94137061, 6.35358907, 7.4729336 ], [2.99658778, 3.37959658, 2.377967 ], [5.83045811, 6.94955662, 7.75866466]])
>>> np.random.normal(0,10,(3,3)) #隨機正態分佈 array([[ -9.53444669, 14.34576579, 8.72807183], [-16.75179589, 12.29402336, 1.52137005], [ -2.42501437, 0.4304297 , -1.90605676]]) >>> np.random.randint(0,10,(3,3)) #隨機整數陣列 array([[9, 9, 0], [1, 6, 6], [5, 2, 4]])
>>> np.eye(3) #對角線為1,其餘位置為0的二維單位矩陣 array([[1., 0., 0.], [0., 1., 0.], [0., 0., 1.]]) >>> np.empty(3) #長度為3的單位向量。結果裡的數字可以為任意,不一定為1 array([1., 1., 1.])
2.陣列的操作
(1)屬性
a.ndim(維度) a.dtype a.size a.shape
(2)索引
>>> a=np.random.randint(0,10,(5,5)) >>> a[1,2] 5 >>> a array([[9, 9, 2, 6, 5], [4, 6, 5, 2, 6], [8, 7, 6, 6, 8], [3, 9, 2, 4, 3], [1, 3, 5, 3, 8]])
>>> a[-1,-4]
3
正數從位置0開始數,負數從1開始
(3)切分
>>> a
array([[9, 9, 2, 6, 5],
[4, 6, 5, 2, 6],
[8, 7, 6, 6, 8],
[3, 9, 2, 4, 3],
[1, 3, 5, 3, 8]])
>>> a[1:4] #從第1行到第4行 array([[4, 6, 5, 2, 6], [8, 7, 6, 6, 8], [3, 9, 2, 4, 3]]) >>> a[0:4] array([[9, 9, 2, 6, 5], [4, 6, 5, 2, 6], [8, 7, 6, 6, 8], [3, 9, 2, 4, 3]]) >>> a[0:4,-2] #從第1行到第4行的矩陣的倒數第2列(負數從0開始)
array([6, 2, 6, 4])
>>> a[0:4,2] #從第1行到第4行的矩陣的正數第3列(正數從1開始)
array([2, 5, 6, 2])
>>> a[0:4,2:4] #0:4表示從第1行到第4行,2:4表示從第3列到第4列
array([[2, 6], [5, 2], [6, 6], [2, 4]])
>>> a[::2] #隔1行取
array([[9, 9, 2, 6, 5],
[8, 7, 6, 6, 8],
[1, 3, 5, 3, 8]])
>>> a[:,[1,2,3]] #取第2,3,4列
array([[9, 2, 6],
[6, 5, 2],
[7, 6, 6],
[9, 2, 4],
[3, 5, 3]])
(4)變形
a.reshape((1,9)) #將a變成1行9列的陣列
(5)拼接和分裂
#拼接
>>> np.concatenate([a,a],axis=0) #axis=0是行。沿著行拼接 或者np.vstack([a,a]) array([[9, 9, 2, 6, 5], [4, 6, 5, 2, 6], [8, 7, 6, 6, 8], [3, 9, 2, 4, 3], [1, 3, 5, 3, 8], [9, 9, 2, 6, 5], [4, 6, 5, 2, 6], [8, 7, 6, 6, 8], [3, 9, 2, 4, 3], [1, 3, 5, 3, 8]]) >>> np.concatenate([a,a],axis=1) #axis是列,沿著列拼接 或者np.hstack([a,a]) array([[9, 9, 2, 6, 5, 9, 9, 2, 6, 5], [4, 6, 5, 2, 6, 4, 6, 5, 2, 6], [8, 7, 6, 6, 8, 8, 7, 6, 6, 8], [3, 9, 2, 4, 3, 3, 9, 2, 4, 3], [1, 3, 5, 3, 8, 1, 3, 5, 3, 8]])
#分裂
>>> up,low=np.vsplit(a,[2]) #將陣列分成前2行,後3行
>>> up
array([[9, 9, 2, 6, 5],
[4, 6, 5, 2, 6]])
>>> low
array([[8, 7, 6, 6, 8],
[3, 9, 2, 4, 3],
[1, 3, 5, 3, 8]])
>>> h,l=np.hsplit(a,[2]) #將陣列分成前兩列,後三3列
>>> h
array([[9, 9],
[4, 6],
[8, 7],
[3, 9],
[1, 3]])
>>> l
array([[2, 6, 5],
[5, 2, 6],
[6, 6, 8],
[2, 4, 3],
[5, 3, 8]])
2.陣列的常用計算
>>> import numpy as np >>> arr2=np.arange(1,12,1) >>> arr2 array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]) >>> np.exp(arr2) #返回arr2的指數 array([2.71828183e+00, 7.38905610e+00, 2.00855369e+01, 5.45981500e+01, 1.48413159e+02, 4.03428793e+02, 1.09663316e+03, 2.98095799e+03, 8.10308393e+03, 2.20264658e+04, 5.98741417e+04])
>>> np.sqrt(arr2) #開方 array([1. , 1.41421356, 1.73205081, 2. , 2.23606798, 2.44948974, 2.64575131, 2.82842712, 3. , 3.16227766, 3.31662479])
>>> np.square(arr2) #平方 array([ 1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121], dtype=int32)
>>> np.modf(np.log(arr2)) #將整數部分和小數部分分開 (array([0. , 0.69314718, 0.09861229, 0.38629436, 0.60943791, 0.79175947, 0.94591015, 0.07944154, 0.19722458, 0.30258509, 0.39789527]), array([0., 0., 1., 1., 1., 1., 1., 2., 2., 2., 2.]))
>>> np.ceil(np.square(arr2)) #向上取整 array([ 1., 4., 9., 16., 25., 36., 49., 64., 81., 100., 121.])
>>> np.floor(np.log1p(arr2)) #向下取整 Log1p是log(x+1) array([0., 1., 1., 1., 1., 1., 2., 2., 2., 2., 2.])
>>> np.rint(np.log2(arr2+1)) #四捨五入取整 array([1., 2., 2., 2., 3., 3., 3., 3., 3., 3., 4.])
>>> np.isinf(np.log10(arr2)) #是否無窮的判斷 array([False, False, False, False, False, False, False, False, False, False, False])
註釋np.min比min更省時間。所以一般用np.min
>>> arr1=np.array([[0,1,2],[3,4,5],[6,7,8]]) >>> arr1 array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]) >>> arr1.cumsum() #全部累加 array([ 0, 1, 3, 6, 10, 15, 21, 28, 36], dtype=int32) >>> arr1.cumsum(0) #按行累加 array([[ 0, 1, 2], [ 3, 5, 7], [ 9, 12, 15]], dtype=int32) >>> arr1.cumsum(1) #按列累加 array([[ 0, 1, 3], [ 3, 7, 12], [ 6, 13, 21]], dtype=int32)
>>> arr1.cumprod() #累乘
array([0, 0, 0, 0, 0, 0, 0, 0, 0], dtype=int32)
>>> arr1.cumprod(0) #按行
array([[ 0, 1, 2],
[ 0, 4, 10],
[ 0, 28, 80]], dtype=int32)
>>> arr1.cumprod(1) #按列
array([[ 0, 0, 0],
[ 3, 12, 60],
[ 6, 42, 336]], dtype=int32)
3.陣列的廣播
(1)如果兩個陣列維度數不一樣,那麼小的陣列會補齊維度
(2)如果兩個陣列形狀在任何維度上都不一樣,那麼會沿著維度為1的維度擴張去匹配另外陣列
(3)如果兩個陣列形狀在任何一個維度都不一樣且沒有一個維度是1,則報錯