1. 程式人生 > 其它 >陣列---numpy

陣列---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,則報錯