Numpy函式庫基礎介紹
阿新 • • 發佈:2018-11-01
寫在最前面:機器學習的本質是數學,是數學在資料上的應用,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]]