什麼是numpy
numpy是python語言的一個第三方的庫,應用於數據分析,實現多維數組與矩陣的高校運算,提供大量的數學函數,也是進入機器學習與人工智能等方面必不可少的需要掌握的技術。
安裝numpy
本地安裝:pip install numpy。
也可以網上安裝具體就自己百度不多說。
numpy的使用方法
首先導入在python中導入模塊:import numpy as np(這裏的as表示的是重命名的意思)
創建一個數組
arrts = np.array([1,2,3],dtype=np.int)#定義他是一個整數類型,int64,int32,也可以定義float類型
print(arrts)
輸出就是:[1 2 3],這個輸出的數字稱爲數組的元素。
輸出的類型爲:numpy.ndarray類型。
創建一個多維數組
arrts = np.array([[1,2,3],
[4,5,6]]) #這就是一個矩陣,外面用一個列表括起來
print(arrts.shape)#輸出的第一個參數表示幾行,第二個表示幾列
輸出結果:(2, 3),shape表示有幾行幾列
創建一個對角數組
a = np.eye(4,dtype=int)
print(a)
輸出結果:
[[1 0 0 0]
[0 1 0 0]
[0 0 1 0]
[0 0 0 1]]
這裏就簡單介紹一下np.exe()不僅能夠創建對角線元素爲1的nxn的二維數組,還可以設置任何一個斜線方向爲等效對角線。
a = np.eye(4,dtype=int,k=1)
print(a)
輸出結果爲:
[[0 1 0 0]
[0 0 1 0]
[0 0 0 1]
[0 0 0 0]]
創建一個等差或等比的數組
np.arange()是一個類似於python中的range()的函數,數組元素符合等差數列,就是後一個元素值與前一個元素值的差等於指定的步長值。
arrts = np.arange(10,20,2)#表示輸出一個10-20之間取偶數
print(arrts)
輸出結果爲:[10 12 14 16 18]
arrts = np.linspace(10,20,5)#表示開始值是10結束值是20共有有5個數
print(arrts)
輸出結果爲:[10. 12.5 15. 17.5 20. ]
區別在於,arange方法原則爲“前包括,後不包括”,而linspace是這個數列總共有的長度。
創建一個自定義數組
a_type = np.dtype([('book','S40'),('version',np.int)])
a = np.array(([(b"learn python",2),(b'learn Django',1)]),dtype=a_type)
print(a)
輸出結果:
[(b'learn python', 2) (b'learn Django', 1)]
S40表示字符串長度爲40,np.int就是整數類型,可以參照numpy內置數組元素類型。
數組的索引
通過索引來獲取到數組的元素
arrts = np.array([[1,2,3],
[4,5,6]])
print(arrts)
print(arrts[1])#獲取索引爲1的行
print(arrts[1][1])#獲取第一行第一列的值
運行結果爲:
[[1 2 3]
[4 5 6]]
[4 5 6]
5
也可以通過下標更改數組的元素:
arrts = np.array([[1,2,3],
[4,5,6]])
arrts[0][1] = 9
print(arrts)
運行結果爲:
[[1 9 3]
[4 5 6]]
數組的切片
根據下標獲取到數組中的一個或幾個的元素:
一維數組的切片
arrts = np.arange(1,20)
print(arrts)
print(arrts[3:6]) #表示輸出下標大於等於3小於6的元素
print(arrts[3:]) #表示輸出下標大於等於3之後的所有元素
print(arrts[:3]) #表示輸出下標小於3之前的所有元素
輸出結果爲:
[ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19]
[4 5 6]
[ 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19]
[1 2 3]
多維數組的切片:
arrts = np.arange(2,14).reshape(3,4)
print(arrts)
print(arrts[1:3]) #表示在行上輸出大於等於索引爲1的行與小於索引爲3的行之間的元素
print(arrts[1:3,1:3]) #表示先在行上切出一片,之後按照列的[1:3]的要求再次切分出來
print(arrts[:,2]) #表示獲取第二列的元素
print(arrts[::2,::2]) #先根據行進行切片再通過列進行切片
print(arrts[:3,[0,3]]) #先根據行進行切片再通過列進行切片
運行結果:
[[ 2 3 4 5]
[ 6 7 8 9]
[10 11 12 13]]
[[ 6 7 8 9]
[10 11 12 13]]
[[ 7 8]
[11 12]]
[ 4 8 12]
[[ 2 4]
[10 12]]
[[ 2 5]
[ 6 9]
[10 13]]
這裏就可以總結出切片大致的兩種方式:
一種是:先根據行進行切片得到的結果再通過列進行切片
二種是:對數組按照行跟列要求進行切片,將兩者的交集作爲最後的結果
數組的變換
將已有的數組按照要求改變形狀不改變他的元素之後形成一個新的數組
一維數組轉換爲二維數組
arrts = np.arange(1,21)
print(arrts)
arrts1 = np.arange(1,21).reshape((4,5))#按照4行5列的輸出,不足或者少於則報錯
print(arrts1)
輸出結果:
[ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20]
[[ 1 2 3 4 5]
[ 6 7 8 9 10]
[11 12 13 14 15]
[16 17 18 19 20]]
可以使用reshape的方法對原數組進行修改
arrts = np.arange(1,21)
print(arrts)
arrts2 = np.reshape(arrts,(4,5))
print(arrts2)
輸出結果:
[ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20]
[[ 1 2 3 4 5]
[ 6 7 8 9 10]
[11 12 13 14 15]
[16 17 18 19 20]]
將多維數組轉換爲一維數組:
arrts = np.arange(1,21)
arrts2 = np.reshape(arrts,(4,5))
print(arrts2)
arrts3 = np.ravel(arrts2)
print(arrts3)
輸出結果爲:
[[ 1 2 3 4 5]
[ 6 7 8 9 10]
[11 12 13 14 15]
[16 17 18 19 20]]
[ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20]
數組的組合
水平組合
a = np.arange(9).reshape(3,3)
b = np.arange(12).reshape(3,4)
c = np.arange(15).reshape(3,5)
print(np.hstack((a,b)))
運行結果:
[[ 0 1 2 0 1 2 3]
[ 3 4 5 4 5 6 7]
[ 6 7 8 8 9 10 11]]
垂直組合
a = np.arange(9).reshape(3,3)
b = np.arange(12).reshape(3,4)
c = np.arange(15).reshape(3,5)
print(np.hstack((a,b)))
b2 = b.T #這個表示他之前的行變爲列,列變爲行
print(np.vstack((a,b2)))
運行結果:
[[ 0 1 2 0 1 2 3]
[ 3 4 5 4 5 6 7]
[ 6 7 8 8 9 10 11]]
[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 0 4 8]
[ 1 5 9]
[ 2 6 10]
[ 3 7 11]]
其他組合
列組合與行組合
a = np.arange(5)
b = np.arange(5,10)
print(np.row_stack((a,b))) #
print(np.column_stack((a,b)))
運行結果:
[[0 1 2 3 4]
[5 6 7 8 9]]
[[0 5]
[1 6]
[2 7]
[3 8]
[4 9]]
上下合併與左右合併
a = np.array([1,1,1])
b = np.array([2,2,2])
c = np.vstack((a,b)) #表示兩個矩陣上下合併
d = np.hstack((a,b))# 表示兩個矩陣左右合併
print(c)
print(d)
運行結果:
[[1 1 1]
[2 2 2]]
[1 1 1 2 2 2]
數組的分割
a = np.arange(12).reshape(3,4) #0-12,3行4列
print(a)
print(np.vsplit(a,3)) #切割三行
print(np.hsplit(a,2)) #切割兩列
運行結果:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]])]
[array([[0, 1],
[4, 5],
[8, 9]]), array([[ 2, 3],
[ 6, 7],
[10, 11]])]
元素的加減乘除
元素加法
a = np.array([10,20,30,40])
b = np.arange(4)
c = a+b #相加
d = a-b #相減
e = a*b #相乘
f = a/10 #相除
print(c)
print(d)
print(e)
print(f)
運行結果:
[10 21 32 43]
[10 19 28 37]
[ 0 20 60 120]
[1. 2. 3. 4.]
元素的增刪改
添加元素
a = np.array([[1,2,3],[4,5,6]])
b = np.array([[7,8,9]])
c = np.append(a,b,axis=0) #按照行的方式進行添加
print(c)
運行結果:
[[1 2 3]
[4 5 6]
[7 8 9]]
修改元素:
d = np.append(a,b) #合併成一個一維數組
e = np.insert(d,1,100)
print(e)
運行結果:
[ 1 100 2 3 4 5 6 7 8 9]
刪除元素:
f = np.delete(a,1,axis=0) #按照行的方式進行刪除
print(f)
運行結果:
[[1 2 3]]
額外:
如果兩個數組的形狀不同,則會報錯,但有的情況除外,有的情況就是numpy將某個數組通過“廣播”的方式進行臨時轉換,使得兩個數組的形狀符合。
a = np.array([[1,2,3],[4,5,6]])
n = np.arange(1,3).reshape((-1,1))
print(a+n)
比如上面這代碼裏面的n單獨輸出的話運行結果:
[[1]
[2]]
但要是他們的行數相同,numpy會自動進行“廣播”,使得a與n數組的形狀一樣再相加,相加後的結果如下:
[[2 3 4]
[6 7 8]]