亞寵展、全球寵物產業風向標——亞洲寵物展覽會深度解析
1508
2022-05-29
Numpy提供的主要功能具體如下:
ndarray——一個具有向量算術運算和復雜廣播能力的多維數組對象。
用于對數組數據進行快速運算的標準數學函數。
用于讀寫磁盤數據的工具以及用于操作內存映射文件的工具。
非常有用的線性代數,傅里葉變換和隨機數操作。
用于集成C /C++和Fortran代碼的工具。
除了明顯的科學計算用途之外,Numpy還可以用作通用數據的高效多維容器,定義任意的數據類型。這些都使得Numpy能夠無縫、快速地與各種數據庫集成。
提示:這里提到的“廣播”可以這么理解:當兩個維度不同的數組(array)運算的時候,可以將低維的數組復制成高維數組參與運算(因為Numpy運算的時候需要結構相同)。
在學習圖像識別的過程中,需要將圖片轉換為矩陣。即將對圖片的處理簡化為向量空間中的向量運算。基于向量運算,我們就可以實現圖像的識別。
01 創建數組
現在就來關注下Numpy中的一些核心知識點。在Numpy中,最核心的數據結構是ndarray, ndarray代表的是多維數組,數組指的是數據的集合。為了方便理解,我們下面列舉一個小例子。
一個班級里學生的學號可以通過一維數組來表示,數組名為a,數組a中存儲的是數值類型的數據,分別是1,2,3,4。
索引
學號
0
1
1
2
2
3
3
4
其中,a[0]代表的是第一個學生的學號1,a[1]代表的是第二個學生的學號2,以此類推。
一個班級里學生的學號和姓名,可以用二維數組來表示,數組名為b。
1
Tim
2
Joey
3
Johnny
4
Frank
類似的,其中b[0,0]代表的就是1(學號),b[0,1]代表的就是Tim(學號為1的學生的名字),以此類推b[1,0]代表的是2(學號)等。
借用線性代數的說法,一維數組通常稱為向量(vector),二維數組通常稱為矩陣(matrix)。
當我們安裝完Anaconda之后,默認情況下Numpy已經在庫中了,所以不需要額外安裝。下面我們來寫一些語句簡單測試下Numpy庫。
1)在Anaconda的Notebook里輸入
import?numpy?as?np
之后,通過鍵盤按住Shift+Enter執行,如果沒有報錯,則說明Numpy已被正常引入,如圖2-7所示。
▲圖2-7 在Notebook中引入Numpy
稍微解釋下這條語句:通過import關鍵字將Numpy庫引入,然后通過as為其取一個別名np,別名的作用是為了便于后續引用。
2)Numpy中的array()可以直接導入向量,代碼如下:
vector?=?np.array([1,2,3,4])
3)numpy.array()方法也可以導入矩陣,代碼如下:
matrix?=?np.array([[1,'Tim'],[2,'Joey'],[3,'Johnny'],[4,'Frank']])
02 創建Numpy數組
我們可以通過創建Python列表(list)的方式來創建Numpy矩陣,比如輸入
nparray?=?np.array([i?for?i?in?range(10)])
可以看到返回的結果是
array([?0,?1,?2,?3,?4,?5,?6,?7,?8,?9])
同樣,也可以通過Python列表的方式來修改值,比如輸入
nparray[0]?=?10
再來觀察nparray的向量內容就會發現返回的結果是
array([?10,?1,?2,?3,?4,?5,?6,?7,?8,?9])
Numpy數組還封裝了其他方法來創建矩陣。首先,我們介紹第一個方法np.zeros(從命名規則來看,這個方法就是用來創建數值都為0的向量),比如,我們輸入:
a?=?np.zeros(10)
可以看到結果為:
array([?0.,??0.,??0.,??0.,??0.,??0.,??0.,??0.,??0.,??0.])
從上述結果可以看出,每一個0后面都有一個小數點,調用a.dtype會發現我們創建的這個向量的類型為dtype(‘float64’)。值得注意的是:在大部分圖像識別算法開發中,我們使用的都是float64這個類型。如果希望在創建Numpy矩陣的時候強制規定一種類型,那么我們可以使用以下代碼:
np.zeros(10,dtype=int)
這樣,返回的結果在矩陣中的數據就都是整型0了。介紹完使用zeros方法創建向量之后,再來看看如何創建一個多維矩陣。我們可以使用傳入元組的方式,代碼如下:
np.zeros(shape=(3,4))?#代表創建的是三行四列的矩陣并且其數據類型為float64
返回的結果為:
array([[?0.,??0.,??0.,??0.],
[?0.,??0.,??0.,??0.],
[?0.,??0.,??0.,??0.]])
與np.zeros方法相似的還有np.ones方法,顧名思義,np.ones方法創建的矩陣的數值都為1。我們來舉個例子:
np.ones((3,4))
返回的結果如下:
array([[?1.,??1.,??1.,??1.],
[?1.,??1.,??1.,??1.],
[?1.,??1.,??1.,??1.]])
讀者可能會比較好奇,既然我們可以創建數值全為0的矩陣,也可以創建數值全為1的矩陣,那么Numpy是否提供了一個方法可以讓我們自己指定值呢?答案是肯定的,這個方法就是np.full方法,我們來看一個例子,代碼如下:
np.full((3,5),121)?#這個方法的意思是我們創建了一個三行五列的矩陣,默認值為121
返回的結果是:
array([[121,?121,?121,?121,?121],
[121,?121,?121,?121,?121],
[121,?121,?121,?121,?121]])
我們也可以使用np.arange方法來創建Numpy的矩陣。示例代碼如下:
np.arange(0,20,2)?#arange接收三個參數,與Python中的range方法相似,arange也是前閉后開的方法,第一個參數為向量的第一個值0,第二個參數為最后一個值20,因為是后開所以取的是18,第三個參數為步長,默認為1,本例中設置為2,所以最后一個值是18。
返回的結果是:
array([?0,??2,??4,??6,??8,?10,?12,?14,?16,?18])
我們可以使用np.linspace方法(前閉后閉)來對Numpy矩陣進行等分,比如將0~10等分為5份的代碼如下:
np.linspace(0,10,5)
返回的結果是:
array([??0.?,???2.5,???5.?,???7.5,??10.?])
下面通過幾個例子再來看看在Numpy矩陣中如何生成隨機數矩陣。
1)生成一個長度為10的向量,里面每一個數值都是介于0~10之間的整數,代碼如下:
import?numpy?as?np
np.random.randint(0,10,10)
2)如果不確定每個參數代表的意思,則加上參數名size,代碼如下:
np.random.randint(0,5,size=5)??#注意是前閉后開,永遠取不到5
3)我們也可以生成一個三行五列的整數矩陣,代碼如下
np.random.randint(4,9,size=(3,5))
4)seed的作用:如果不希望每次生成的隨機數都不固定,那么我們可以使用np.random.seed(1),隨機種子使用數字1記錄,這以后只要是用隨機種子1生成的隨機數就都是固定的。
5)我們也可以生成介于0~1之間的浮點數的向量或者矩陣,代碼如下:
np.random.random(10)????????#生成0~1之間的浮點數,向量的長度為10
np.random.random((2,4))????????#生成0~1之間的浮點數,二行四列的矩陣
6)np.random.normal()表示的是一個正態分布,normal在這里是正態的意思。numpy.random.normal(loc=0,scale=1,size=shape)的意義如下:
參數loc(float):正態分布的均值,對應這個分布的中心。loc=0說明這是一個以Y軸為對稱軸的正態分布。
參數scale(float):正態分布的標準差,對應分布的寬度,scale越大,正態分布的曲線越矮胖,scale越小,曲線越高瘦。
參數size(int或者整數元組):輸出的值賦在shape里,默認為None。
03 獲取Numpy屬性
首先,我們通過Numpy中的一個方法arange(n),生成0到n-1的數組。比如,我們輸入
np.arange(15)
可以看到返回的結果是
array([?0,?1,?2,?3,?4,?5,?6,?7,?8,?9,?10,?11,?12,?13,?14])
然后,再通過Numpy中的reshape(row,column)方法,自動構架一個多行多列的array對象。
比如,我們輸入:
a?=?np.arange(15).reshape(3,5)????????#代表3行5列
可以看到結果:
array([[?0,??1,??2,??3,??4],
[?5,??6,??7,??8,??9],
[10,?11,?12,?13,?14]])
有了基本數據之后,我們就可以通過Numpy提供的shape屬性獲取Numpy數組的行數與列數,示例代碼如下:
print(a.shape)
可以看到返回的結果是一個元組(tuple),第一個3代表的是3行,第二個5代表的是5列:
(3,?5)
我們可以通過.ndim來獲取Numpy數組的維度,示例代碼如下:
importnumpy?as?np
x?=?np.arange(15)
print(x.ndim)????????#輸出x向量的維度,這時能看到的維度是1維
X?=?x.reshape(3,5)????#將x向量轉為三行五列的二維矩陣
Print(X.ndim)????????#輸出X矩陣的維度,這時能看到的維度是2維
reshape方法的特別用法
如果只關心需要多少行或者多少列,其他由計算機自己來算,那么這個時候我們可以使用如下方法:
x.reshape(15,-1)????#我關心的是我只要15行,列由計算機自己來算
x.reshape(-1,15)????#我關心的是我只要15列,行由計算機自己來算
04 Numpy數組索引
Numpy支持類似list的定位操作,示例代碼如下:
import?numpy?as?np
matrix?=?np.array([[1,2,3],[20,30,40]])
print(matrix[0,1])
得到的結果是2。
上述代碼中的matrix[0,1],0代表的是行,在Numpy中,0代表起始的第一個,所以取的是第1行,之后的1代表的是列,所以取的是第2列。那么,最后的輸出結果是取第一行第二列,也就是2這個值了。
05 切片
Numpy支持類似list的切片操作,示例代碼如下:
import?numpy?as?np
matrix?=?np.array([
[5,?10,?15],
[20,?25,?30],
[35,?40,?45]
])
print(matrix[:,1])
print(matrix[:,0:2])
print(matrix[1:3,:])
print(matrix[1:3,0:2])
上述的代碼中
print(matrix[:,1])語法代表選擇所有的行,而且列的索引是1的數據,因此返回的結果是10,25,40。
print(matrix[:,0:2])代表的是選取所有的行,而且列的索引是0和1的數據。
print(matrix[1:3,:])代表的是選取所有的列,而且行的索引值是1和2的數據。
print(matrix[1:3,0:2])代表的是選取行的索引是1和2,而且列的索引是0和1的所有數據。
06 Numpy中的矩陣運算
矩陣運算(加、減、乘、除),在本書中將嚴格按照數學公式來進行演示,即兩個矩陣的基本運算必須具有相同的行數與列數。本例只演示兩個矩陣相減的操作,其他的操作讀者可以自行測試。示例代碼如下:
import?numpy?as?np
myones?=?np.ones([3,3])
myeye?=?np.eye(3)????????#生成一個對角線的值為1,其余值都為0的三行三列矩陣
print(myeye)
print(myones-myeye)
輸出結果如下:
[[?1.??0.??0.]
[?0.??1.??0.]
[?0.??0.??1.]]
[[?0.??1.??1.]
[?1.??0.??1.]
[?1.??1.??0.]]
提示:numpy.eye(N, M=None, k=0, dtype=
除此之外,Numpy還預置了很多函數,使用這些函數可以作用于矩陣中的每個元素。
Numpy預置函數及說明:
np.sin(a):對矩陣a中的每個元素取正弦,sin(x)
np.cos(a):對矩陣a中的每個元素取余弦,cos(x)
np.tan(a):對矩陣a中的每個元素取正切,tan(x)
np.sqrt(a):對矩陣a中的每個元素開根號
np.abs(a):對矩陣a中的每個元素取絕對值
1. 矩陣之間的點乘
矩陣真正的乘法必須滿足第一個矩陣的列數等于第二個矩陣的行數,矩陣乘法的函數為dot。示例代碼如下:
import?numpy?as?np
mymatrix?=?np.array([[1,2,3],[4,5,6]])
a?=?np.array([[1,2],[3,4],[5,6]])
print(mymatrix.shape[1]?==?a.shape[0])
print(mymatrix.dot(a))
其輸出結果如下:
[[22?28]
[49?64]]
上述示例代碼的原理是將mymatrix的第一行[1,2,3]與a矩陣的第一列[1,3,5]相乘然后相加,接著將mymatrix的第一行[1,2,3]與a矩陣的第二列[2,4,6]相乘然后相加,以此類推。
2. 矩陣的轉置
矩陣的轉置是指將原來矩陣中的行變為列。示例代碼如下:
import?numpy?as?np
a?=?np.array([[1,2,3],[4,5,6]])
print(a.T)
輸出結果如下:
[[1?4]
[2?5]
[3?6]]
3. 矩陣的逆
需要首先導入numpy.linalg,再用linalg的inv函數來求逆,矩陣求逆的條件是矩陣的行數和列數必須是相同的。示例代碼如下:
import?numpy?as?np
import?numpy.linalg?as?lg
A?=?np.array([[0,1],[2,3]])
invA?=?lg.inv(A)
print(invA)
print(A.dot(invA))
輸出結果如下:
[[-1.5??0.5]
[?1.???0.?]]
逆矩陣就是,原矩陣A.dot(invA)以及逆矩陣invA.dot(A)的結果都為單位矩陣。并不是所有的矩陣都有逆矩陣。
07 數據類型轉換
Numpy ndarray數據類型可以通過參數dtype進行設定,而且還可以使用參數astype來轉換類型,在處理文件時該參數會很實用。注意,astype調用會返回一個新的數組,也就是原始數據的備份。
比如,將String轉換成float。示例代碼如下:
vector?=?numpy.array(["1",?"2",?"3"])
vector?=?vector.astype(float)
注意:在上述例子中,如果字符串中包含非數字類型,那么從string轉換成float就會報錯。
人工智能
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。