1、NumPy是什麼
機器學習中常用到一個科學計算庫叫NumPy:
NumPy就是一個矩陣數組。是一個多維陣列對象,稱為ndarray。
如:
import numpya = numpy.array([[1,2,3,4], [5,6,7,8], [1,3,5,7]])print(a)print(a.ndim)print(a.shape)print(a.size)print(a.dtype)print(a.itemsize)
需要注意的是:同一個NumPy數組中所有的元素必須是相同的。
2、NumPy屬性介紹
NumPy數組的維數稱為秩(rank),一維數組的秩為1,二維數組的秩為2。每一個線性數組稱為是一個軸(axes),秩即為軸的數量。上文提到的那個ndarray就是二維數組,秩為2。
numpy中常用的對象屬性:
1、ndarray.ndim:數組的維數,等於秩;
2、ndarray.shape:數組的維度,為一個標識數組在每個維度上大小的整數元組,上述ndarray的shape列印就是(3, 4);同時這個元組的長度就是數組的維數,即ndim;
3、ndarray.size:數組元素的總個數,等於shape中元素的乘積,上述ndarray的size就是12;
4、ndarray.dtype:數組中元素類型;
5、ndarray.itemsize:數組中每個元素的位元組大小,上述ndarray元素是int64類型,int64佔用64個bits,每個位元組長度為8,所以佔用64/8等於8個位元組。 3、numpy的使用
1、建立一個元素為0--14,(3,5)維度矩陣
vector = numpy.arange(15)print(vector)vector2 = vector.reshape(3,5) # 向量轉換成矩陣print(vector2)# 輸出的結果為[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14][[ 0 1 2 3 4] [ 5 6 7 8 9] [10 11 12 13 14]]
2、指定一個矩陣,元素都為0
vector3 = numpy.zeros((3,4))print(vector3)# 輸出的結果為[[ 0. 0. 0. 0.] [ 0. 0. 0. 0.] [ 0. 0. 0. 0.]]
3、
a = numpy.array([[1,2,3,4], [5,6,7,8], [1,3,5,7]])print(a)print(a[:,1])# 輸出的結果為[[1 2 3 4] [5 6 7 8] [1 3 5 7]][2 6 3] #這個結果意思是取任意行中第1列的元素
4、
print(numpy.arange(10,30,5))# 輸出的結果為[10 15 20 25]# 如果需要知道這個方法的意義,可以列印help函數查詢,如:print(help(numpy.arange))
5、
# vector3 = numpy.ones((2,3,4),dtype=numpy.int32)# vector3 = numpy.random.random((2,3)) # 利用random模組隨機取數構造2行3列的數組vector3 = numpy.linspace(0, 9, 10) # linspace從0到9平均取10個數構造數組,包含0和9print(vector3)
6、ndarray的計算
# ndarray的計算a = numpy.array([20,30,40,50])b = numpy.arange(4)print(a-b)print(a-1)# 輸出結果是:[20 29 38 47][19 29 39 49]
7、矩陣的*運算和.dot運算
a = numpy.array([[1,2], [2,3]])b = numpy.array([[1,3], [2,4]])# print(a*b)print(a.dot(b))# print(numpy.dot(a,b))
8、矩陣冪運算和根號運算
a = numpy.arange(3)print(a)print(numpy.exp(a))print(numpy.square(a))#輸出結果是[0 1 2][ 1. 2.71828183 7.3890561 ][0 1 4]
9、numpy.floor(a)和numpy.random.random((3,4))
a = 10*numpy.random.random((3,4))print(a)a = numpy.floor(a)print(a)print(a.revel()) # 矩陣轉向量a.shape = (6,2)print(a.T) # 矩陣的轉置# 輸出結果:[[ 5.40834281 4.269162 7.92982643 4.279437 ] [ 7.89479131 4.06550228 1.76543625 1.47728591] [ 9.26177306 8.97762938 6.38632298 6.02355195]][[ 5. 4. 7. 4.] [ 7. 4. 1. 1.] [ 9. 8. 6. 6.]][ 6. 6. 9. 3. 0. 9. 2. 2. 7. 7. 0. 6.][[ 6. 4. 9. 5. 2. 7.] [ 5. 1. 0. 8. 6. 1.]]
10、矩陣拼接
a = numpy.floor(10*numpy.random.random((2,2)))b = numpy.floor(10*numpy.random.random((2,2)))print(a)print(b)print(numpy.hstack((a,b))) #橫著拼# print(numpy.vstack((a,b))) #豎著拼# 輸出結果:[[ 6. 3.] [ 8. 4.]][[ 6. 8.] [ 2. 2.]][[ 6. 3. 6. 8.] [ 8. 4. 2. 2.]]
11、矩陣的裁剪
a = numpy.floor(10*numpy.random.random((4,6)))print(a)print(numpy.hsplit(a,3))print(numpy.vsplit(a,2))# 輸出的結果[[ 9. 6. 3. 3. 5. 3.] [ 3. 4. 4. 7. 8. 7.] [ 9. 9. 0. 1. 0. 1.] [ 3. 1. 9. 1. 5. 6.]][array([[ 9., 6.], [ 3., 4.], [ 9., 9.], [ 3., 1.]]), array([[ 3., 3.], [ 4., 7.], [ 0., 1.], [ 9., 1.]]), array([[ 5., 3.], [ 8., 7.], [ 0., 1.], [ 5., 6.]])][array([[ 9., 6., 3., 3., 5., 3.], [ 3., 4., 4., 7., 8., 7.]]), array([[ 9., 9., 0., 1., 0., 1.], [ 3., 1., 9., 1., 5., 6.]])]
12、矩陣的複製操作
定義一個ndarray對象a,
如果b = a,則a與b所指向的地址一樣,a與b的值相同,b的值改變a的值也會改變;
如果c = a.view(),則a與b所指向的地址不一樣,a與c的值相同,c的值改變,a的值也會改變;
如果d = a.copy(),則a與d所指向的地址不一樣,a與d的值也無關聯,d的值改變,a的值不改變。
13、找矩陣中每列最大元素所在的行,並拿到最大值:
a = numpy.sin(numpy.arange(20).reshape(5,4))print(a)maxIndex = a.argmax(axis = 0)print(maxIndex)maxData = a[maxIndex, range(a.shape[1])]print(maxData)# 輸出的結果是:[[ 0. 0.84147098 0.90929743 0.14112001] [-0.7568025 -0.95892427 -0.2794155 0.6569866 ] [ 0.98935825 0.41211849 -0.54402111 -0.99999021] [-0.53657292 0.42016704 0.99060736 0.65028784] [-0.28790332 -0.96139749 -0.75098725 0.14987721]][2 0 3 1][ 0.98935825 0.84147098 0.99060736 0.6569866 ]