numpy入門指南

R-B發表於2021-09-09

當我們準備把機器學習的各種演算法使用python語言落地實現時,有一個工具我們一定要使用,那就是numpy。因為numpy底層使用C++實現,利用了CPU或者GPU的技術,使得numpy的矩陣運算比python本身自帶的list資料結構運算高效很多,特別是在處理大資料時,其優勢更是明顯。本文主要介紹numpy的基本使用方法,更多高階用法大家可以參考

一、numpy的安裝及匯入

安裝:命令列中輸入以下程式碼

pip3 install numpy

匯入:為了簡便,這裡使用np作為numpy的縮寫

import numpy as np

二、新建矩陣以及numpy矩陣的屬性

新建矩陣:使用array函式,傳入一個list
numpy矩陣屬性含義:
ndim:矩陣的維數
shape:矩陣的形狀(每一個維度上的size)
size:矩陣的大小(第一個維度上的size)

array = np.array([[1, 2, 3],
                  [2, 3, 4]])print('dim:', array.ndim)# 輸出 dim: 2print('shape:', array.shape)# 輸出 shape: (2, 3)print('size:', array.size)# 輸出 size: 6

三、建立不同型別的基本矩陣

array:根據傳入的list建立矩陣
zeros:根據傳入的shape建立一個零矩陣(每個元素都為零)
empty:根據傳入的shape建立一個幾乎為零的矩陣(每個元素都幾乎為零)
arange
三個引數時:
第一個參數列示起始值,第二個參數列示結尾值,第三個參數列示增長值
一個引數時:
相當於起始值為0,結尾值為該引數,增長值為1
linspace:第一個參數列示起始值,第二個參數列示結束值,第三個參數列示要分成份數
random.random:根據傳入的shape生成一個隨機矩陣,每一個元素的值都是隨機數
(引數dtype用來定義矩陣元素的儲存型別,reshape函式,將矩陣按照傳入的shape調整矩陣形狀)

a = np.array([[2, 33, 55], [3, 9, 13]], dtype=np.float32)# array([[  2.,  33.,  55.],#        [  3.,   9.,  13.]], dtype=float32)b = np.zeros((3, 4), dtype=np.int64)# array([[0, 0, 0, 0],#        [0, 0, 0, 0],#        [0, 0, 0, 0]])c = np.empty((3, 4))# array([[  0.00000000e+000,   0.00000000e+000,   2.12397093e-314,  2.12524611e-314],#        [  2.14770623e-314,   2.12331478e-314,   2.12331472e-314,  2.12400038e-314],#        [  2.12400043e-314,   2.14741897e-314,   2.13926764e-314,  2.14770776e-314]])d = np.arange(3, 9, 1)# array([3, 4, 5, 6, 7, 8])e = np.arange(12).reshape((3, 4))# array([[ 0,  1,  2,  3],#        [ 4,  5,  6,  7],#        [ 8,  9, 10, 11]])f = np.linspace(1, 21, 10).reshape((5, 2))# array([[  1.        ,   3.22222222],#        [  5.44444444,   7.66666667],#        [  9.88888889,  12.11111111],#        [ 14.33333333,  16.55555556],#        [ 18.77777778,  21.        ]])g = np.random.random((3, 4))# array([[ 0.17233778,  0.46768354,  0.14473541,  0.02593317],#        [ 0.77383741,  0.71766547,  0.90690193,  0.83787435],#        [ 0.76650035,  0.21221298,  0.61345672,  0.51163584]])

四、矩陣的基本運算

矩陣的基本運算有 加(+)、減(-)、乘(*)、除(/)、乘方(**)、是否等於(==或者!=)、點乘(dot)

a = np.array([10, 20, 30, 40])
b = np.arange(1, 5, 1)print('sum = t', a + b)print('diff = t', a - b)print('prod = t', a * b)print('divi = t', a / b)print('pow = t', a ** 3)print('!= = t', a != 10)print('dot = t', np.dot(a, b))print('dot = t', a.dot(b))

五、矩陣的高階運算

求和(sum)、最大值(max)、最小值(min)、最大索引值(argmax)、最小索引值(argmin)、加權平均(average)、累加值(cumsum)、差值(diff)、非零元素索引值(nonzero)、排序(sort)、轉置(transpose或者T)、修剪(clip)、平均值(mean)
(引數:axis=0表示縱向,axis=1表示橫向)

c = np.arange(12, 0, -1).reshape((3, 4))print(c)# axis=1每一行 axis=0每一列print('sum = t', np.sum(c, axis=1))print('max = t', np.max(c, axis=0))print('min = t', np.min(c, axis=0))print('argmax = t', np.argmax(c))print('argmin = t', np.argmin(c))print('average = t', np.average(c))print('cumsum = t', np.cumsum(c))print('diff = t', np.diff(c))print('nonzero = t', np.nonzero(c))print('sort = t', np.sort(c))print('transpose = t', np.transpose(c))print('c.T = t', c.T)print('clip = t', np.clip(c, 5, 9))print('mean = t', np.mean(c, axis=1))

六、矩陣的合併

vstack 縱向合併
hstack 橫向合併
concatenate 透過指定axis引數的值決定是縱向合併還是橫向合併

# newaxis 加一個維度A = np.array([1, 1, 1])[np.newaxis,:]
B = np.array([2, 2, 2])[np.newaxis,:]# vertial 縱向合併print(np.vstack((A, B)))# horizontal 橫向合併print(np.hstack((A, B)))# axis=0 縱向 axis=1 橫向C = np.concatenate((A, B, B, A), axis=0)print(C)

七、矩陣的分割

vsplit  縱向分割
hsplit  橫向分割
split   透過指定axis引數的值決定是縱向分割還是橫向分割

A = np.arange(1, 13, 1).reshape((3, 4))print(A)# axis=0 縱向分割 axis=1 橫向分割# 等項分割print(np.split(A, 2, axis=1))# 不等項分割print(np.array_split(A, 3, axis=1))# vsplit(axis=0), hsplit(axis=1)print(np.vsplit(A, 3))print(np.hsplit(A, 2))

八、矩陣的淺複製與深複製

=  淺複製,只是複製了引用
copy()  深複製

  # 淺複製 只是複製了引用
  A = np.array([1, 2, 3])
  B = A
  A[0] = 99
  print(A)  print(B)  # 深複製
  B = A.copy()
  A[0] = 88
  print(A)  print(B)



作者:大雄的學習人生
連結:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4560/viewspace-2804549/,如需轉載,請註明出處,否則將追究法律責任。