數據必備 Python 庫:Numpy 使用詳解

      網友投稿 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

      玩數據必備 Python 庫:Numpy 使用詳解

      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=)中第一個參數輸出矩陣(行數=列數),第三個參數默認情況下輸出的是對角線的值全為1,其余值全為0。

      除此之外,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小時內刪除侵權內容。

      上一篇:RDS快速入門【玩轉華為云】
      下一篇:Linux文件權限 出爐啦, 快進來學習收藏吧!
      相關文章
      中文字幕亚洲情99在线| 亚洲男女性高爱潮网站| 亚洲午夜无码毛片av久久京东热| 亚洲精品熟女国产| 亚洲图片在线观看| 亚洲综合视频在线| 91亚洲精品视频| 337p欧洲亚洲大胆艺术| 亚洲一区二区在线视频| 亚洲伊人久久大香线蕉苏妲己| 亚洲V无码一区二区三区四区观看 亚洲αv久久久噜噜噜噜噜 | 狠狠色婷婷狠狠狠亚洲综合| 国产亚洲成在线播放va| 日批日出水久久亚洲精品tv| 成a人片亚洲日本久久| 精品亚洲福利一区二区| 在线亚洲v日韩v| 亚洲国产精品狼友中文久久久| 亚洲国产精品日韩专区AV| 久久久无码精品亚洲日韩软件 | 亚洲精品福利网泷泽萝拉| 亚洲图片中文字幕| 亚洲精品福利你懂| 亚洲中文精品久久久久久不卡| 亚洲精品久久久久无码AV片软件| 亚洲乱码国产乱码精华| 国产成人高清亚洲一区91| 亚洲精品成a人在线观看| 亚洲中文字幕无码永久在线| 国产亚洲av片在线观看播放 | 亚洲成熟丰满熟妇高潮XXXXX| 亚洲高清无码专区视频| JLZZJLZZ亚洲乱熟无码| 亚洲日韩小电影在线观看| 亚洲AV日韩AV天堂一区二区三区| 97se亚洲综合在线| 亚洲一卡一卡二新区无人区| 国产亚洲福利一区二区免费看| 中文字幕亚洲综合久久男男| 亚洲av综合avav中文| 亚洲成人福利在线观看|