1. 程式人生 > >Numpy函式庫基礎介紹

Numpy函式庫基礎介紹

寫在最前面:機器學習的本質是數學,是數學在資料上的應用,python的Numpy函式庫對於線性代數的處理有著很好的效果

構建一個5x5的隨機陣列

a = random.rand(5,5)
print(type(a))
print(a)
<class 'numpy.ndarray'>
[[0.25523539 0.18672544 0.13211871 0.02976256 0.27596135]
 [0.02602847 0.94473667 0.19747157 0.7082606  0.02579286]
 [0.60821924 0.15340741 0.14053278 0.64514422 0.55603114]
 [0.33629013 0.78294866 0.74654038 0.54908445 0.92103958]
 [0.76463527 0.78219568 0.04659293 0.33617911 0.00824435]]

此時大家可以看到,我們建立了一個數組。

然後我們把陣列轉化為矩陣

randomMat = mat(a)
print(type(randomMat))
print(randomMat)
<class 'numpy.matrixlib.defmatrix.matrix'>
[[0.44161805 0.83401376 0.61029327 0.05150283 0.92170338]
 [0.90328784 0.05417499 0.2890834  0.73348374 0.41682442]
 [0.93416784 0.41967522 0.96965584 0.1187087  0.58684984]
 [0.01172604 0.25642675 0.10434218 0.33808193 0.43006809]
 [0.75970918 0.0382442  0.45915119 0.68941119 0.16452291]]

由於這是分步執行的,產生的陣列是個隨機陣列,所以每次資料都會不一樣

Numpy函式庫存在兩種不同的資料型別,矩陣matrix和陣列array。那麼matrix和array有什麼區別呢?其實matrix是包含在array裡的,簡單來說,你要是不知道什麼時候用哪個,一律用array就肯定沒問題。

Numpy matrix必須是2維的,但是 numpy arrays (ndarrays) 可以是多維的(1D,2D,3D····ND)。 matrix是Array的一個小的分支,包含於Array。所以matrix 擁有array的所有特性。

在numpy中matrix的主要優勢是:相對簡單的乘法運算子號。例如,a和b是兩個matrices,那麼a*b,就是矩陣積。而不用np.dot()。

下面來看一個栗子:

x = np.mat([[3,5],[2,6]])
print(x)
y = np.mat([[1,7],[6,4]])
print(y)
print(type(x))
print(x*y)
[[3 5]
 [2 6]]
[[1 7]
 [6 4]]
<class 'numpy.matrixlib.defmatrix.matrix'>
[[33 41]
 [38 38]]

 

這裡我們直接定義了兩個矩陣,此時可以看到,matrix可以直接使用*得到矩陣相乘的積。

我們再定義兩個陣列,如果直接相乘,結果並不是我們想要的

xx = np.array([[3,5],[2,6]])
print(xx)
yy = np.array([[1,7],[6,4]])
print(yy)
print(type(xx))
print(xx*yy)
print(np.dot(xx,yy))
[[3 5]
 [2 6]]
[[1 7]
 [6 4]]
<class 'numpy.ndarray'>
[[ 3 35]
 [12 24]]
[[33 41]
 [38 38]]

上圖倒數第二個結果並不是兩個陣列相乘的正確結果,只是陣列每個位置上數字的乘積,而正確輸出陣列乘積的應該是:

print(np.dot(xx,yy))

好,我們回到Numpy函式庫的介紹

矩陣的逆:

randomMat = mat(random.rand(5,5))
print(type(randomMat))
print(randomMat,randomMat.I)
<class 'numpy.matrixlib.defmatrix.matrix'>
[[0.68775072 0.55116675 0.93077221 0.12091721 0.5814328 ]
 [0.43057471 0.61668641 0.29150797 0.06954227 0.46725422]
 [0.2599995  0.21906031 0.26223958 0.39303605 0.28256826]
 [0.29460098 0.66910716 0.70821986 0.22080112 0.90003657]
 [0.76028929 0.33743323 0.973075   0.93021911 0.72884654]] [[ -2.45164987   5.25417727 -11.0615229   -1.72802693   5.00977322]
 [  3.71563501  -3.39165379  14.96032473  -0.0394158   -6.54110922]
 [  3.78836154  -4.76392273   8.20658304   0.45518946  -3.71178508]
 [  0.69855233  -2.03752061   7.38608525  -0.13065884  -1.95321868]
 [ -5.11216288   5.05011211 -15.77074349   1.37986308   6.62289943]]

儲存結果:

xrandomMat = randomMat.I

矩陣乘矩陣的逆,得到的應該是一個5x5的單位矩陣

[[ 1.00000000e+00  2.87815981e-16 -1.74683844e-16  9.11509282e-17
   5.05857032e-17]
 [-4.82206268e-16  1.00000000e+00 -1.16372757e-16  2.96491689e-16
  -6.02937360e-18]
 [ 5.27045023e-17 -7.69342830e-17  1.00000000e+00  2.34971904e-16
   6.95768890e-17]
 [-5.92025864e-16  3.21822869e-16 -1.09667017e-16  1.00000000e+00
   1.37530212e-16]
 [-3.05819205e-16  1.29351787e-16  1.00859225e-16  3.60001040e-16
   1.00000000e+00]]

但是我們發現除了對角線的5個數字,其餘的元素並不完全是0,這是由於計算機處理的一點誤差,我們用我們計算出來的單位矩陣減去建立的一個5x5的單位矩陣,得到誤差矩陣

[[ 0.00000000e+00 -5.45624584e-17 -5.73678895e-17 -5.46094235e-17
   2.68868638e-17]
 [-1.00797709e-18 -1.11022302e-16 -9.62047088e-17 -4.14814528e-17
   1.21962924e-17]
 [ 2.73368064e-17  1.48584446e-16 -1.11022302e-16 -9.67898328e-17
   4.10587699e-17]
 [ 2.38316603e-17 -1.57699794e-16 -6.87584900e-17  2.22044605e-16
   3.90459055e-17]
 [ 6.75350523e-18  4.67157107e-17  8.11073271e-17  3.44711839e-17
   0.00000000e+00]]

矩陣的轉置:

randomMat = mat(random.rand(5,5))
xrandomMat = randomMat.T
print(randomMat,xrandomMat)
[[0.39412548 0.10714949 0.01291286 0.29695853 0.61813766]
 [0.38583395 0.72695652 0.80252661 0.68591293 0.9086151 ]
 [0.14943146 0.59734579 0.76504651 0.51369465 0.22559721]
 [0.15521877 0.1703934  0.33845128 0.4338031  0.54092755]
 [0.71906317 0.53943771 0.20445043 0.85749641 0.53176807]] [[0.39412548 0.38583395 0.14943146 0.15521877 0.71906317]
 [0.10714949 0.72695652 0.59734579 0.1703934  0.53943771]
 [0.01291286 0.80252661 0.76504651 0.33845128 0.20445043]
 [0.29695853 0.68591293 0.51369465 0.4338031  0.85749641]
 [0.61813766 0.9086151  0.22559721 0.54092755 0.53176807]]