AI基础:Numpy简易入门
本文提供最簡(jiǎn)易的 Numpy 的入門教程,適合初學(xué)者。(黃海廣)
1.Numpy 簡(jiǎn)易入門
NumPy(Numeric Python)提供了許多高級(jí)的數(shù)值編程工具,如:矩陣數(shù)據(jù)類型、矢量處理,以及精密的運(yùn)算庫(kù)。專為進(jìn)行嚴(yán)格的數(shù)字處理而產(chǎn)生。多為很多大型金融公司使用,以及核心的科學(xué)計(jì)算組織如:Lawrence Livermore,NASA 用其處理一些本來(lái)使用 C++,Fortran 或 Matlab 等所做的任務(wù)。
我曾經(jīng)整理過(guò)兩篇關(guān)于Numpy的文章,好評(píng)如潮:
Numpy練習(xí)題100題-提高你的數(shù)據(jù)分析技能
本文總結(jié)了Numpy的常用操作,并做成練習(xí)題,練習(xí)題附答案建議讀者把練習(xí)題完成。作者認(rèn)為,做完練習(xí)題,Numpy的基本操作沒(méi)有問(wèn)題了,以后碰到問(wèn)題也可以查這些習(xí)題。
驚為天人,NumPy手寫全部主流機(jī)器學(xué)習(xí)模型,代碼超3萬(wàn)行
用 NumPy 手寫所有主流 ML 模型,普林斯頓博士后 David Bourgin 最近開(kāi)源了一個(gè)非常剽悍的項(xiàng)目。超過(guò) 3 萬(wàn)行代碼、30 多個(gè)模型。
怎么學(xué):
先完整運(yùn)行本文的代碼,預(yù)計(jì)用一天時(shí)間就夠了,再嘗試完成Numpy練習(xí)題100題,鞏固下,接著呢?可以看看上面那篇文章的大神手寫的主流機(jī)器學(xué)習(xí)模型代碼,看懂就行。
備注:本文代碼可以在github下載
https://github.com/fengdu78/Data-Science-Notes/tree/master/2.numpy
1.1 認(rèn)識(shí) NumPy 數(shù)組對(duì)象
Numpy 是一個(gè)用 python 實(shí)現(xiàn)的科學(xué)計(jì)算的擴(kuò)展程序庫(kù),包括:
1、一個(gè)強(qiáng)大的 N 維數(shù)組對(duì)象 Array;
2、比較成熟的(廣播)函數(shù)庫(kù);
3、用于整合 C/C++和 Fortran 代碼的工具包;
4、實(shí)用的線性代數(shù)、傅里葉變換和隨機(jī)數(shù)生成函數(shù)。numpy 和稀疏矩陣運(yùn)算包 scipy 配合使用更加方便。
1.2 創(chuàng)建 NumPy 數(shù)組
import numpy as np data1 = np.array([1, 2, 3]) # 創(chuàng)建一個(gè)一維數(shù)組 data1 array([1, 2, 3]) data2 = np.array([[1, 2, 3], [4, 5, 6]]) # 創(chuàng)建一個(gè)二維數(shù)組 data2 array([[1, 2, 3],[4, 5, 6]]) np.zeros((3, 4))#創(chuàng)建一個(gè)全0數(shù)組 array([[0., 0., 0., 0.],[0., 0., 0., 0.],[0., 0., 0., 0.]]) np.ones((3, 4))#創(chuàng)建全一數(shù)組 array([[1., 1., 1., 1.],[1., 1., 1., 1.],[1., 1., 1., 1.]]) np.empty((5, 2))# 創(chuàng)建全空數(shù)組,其實(shí)每個(gè)值都是接近于零的數(shù) array([[ 6.95312756e-310, 2.12199579e-314],[ 2.12199579e-314, 4.94065646e-324],[ 0.00000000e+000, -7.06252554e-311],[ 0.00000000e+000, -8.12021073e-313],[ 1.29923372e-311, 2.07507571e-322]]) np.arange(1, 20, 5) array([ 1, 6, 11, 16]) np.array([1, 2, 3, 4], float) array([1., 2., 3., 4.]) np.ones((2, 3), dtype='float64') array([[1., 1., 1.],[1., 1., 1.]])1.3 ndarry 對(duì)象的數(shù)據(jù)類型
1.3.1 查看數(shù)據(jù)類型
data_one = np.array([[1, 2, 3], [4, 5, 6]]) data_one.dtype.name 'int32'1.3.2 轉(zhuǎn)換數(shù)據(jù)類型
data = np.array([[1, 2, 3], [4, 5, 6]]) data.dtype dtype('int32') float_data = data.astype(np.float64) # 數(shù)據(jù)類型轉(zhuǎn)換為float64 float_data.dtype dtype('float64') float_data = np.array([1.2, 2.3, 3.5]) float_data array([1.2, 2.3, 3.5]) int_data = float_data.astype(np.int64) # 數(shù)據(jù)類型轉(zhuǎn)換為int64 int_data array([1, 2, 3], dtype=int64) str_data = np.array(['1', '2', '3']) int_data = str_data.astype(np.int64) int_data array([1, 2, 3], dtype=int64)1.4 數(shù)組運(yùn)算
1.4.1 向量化運(yùn)算
import numpy as np data1 = np.array([[1, 2, 3], [4, 5, 6]]) data2 = np.array([[1, 2, 3], [4, 5, 6]]) data1 + data2 # 數(shù)組相加 array([[ 2, 4, 6],[ 8, 10, 12]]) data1 * data2 # 數(shù)組相乘 array([[ 1, 4, 9],[16, 25, 36]]) data1 - data2 # 數(shù)組相減 array([[0, 0, 0],[0, 0, 0]]) data1 / data2 # 數(shù)組相除 array([[1., 1., 1.],[1., 1., 1.]])1.4.2 數(shù)組廣播
numpy 數(shù)組間的基礎(chǔ)運(yùn)算是一對(duì)一,也就是a.shape==b.shape,但是當(dāng)兩者不一樣的時(shí)候,就會(huì)自動(dòng)觸發(fā)廣播機(jī)制,如下例子:
import numpy as np arr1 = np.array([[0], [1], [2], [3]]) arr1.shape (4, 1) arr2 = np.array([1, 2, 3]) arr2.shape (3,) arr1 + arr2 array([[1, 2, 3],[2, 3, 4],[3, 4, 5],[4, 5, 6]])到這里,我們來(lái)給出一張圖:
也可以看這張圖:
1.4.3 數(shù)組與標(biāo)量間的運(yùn)算
import numpy as np data1 = np.array([[1, 2, 3], [4, 5, 6]]) data2 = 10 data1 + data2 # 數(shù)組相加 array([[11, 12, 13],[14, 15, 16]]) data1 * data2 # 數(shù)組相乘 array([[10, 20, 30],[40, 50, 60]]) data1 - data2 # 數(shù)組相減 array([[-9, -8, -7],[-6, -5, -4]]) data1 / data2 # 數(shù)組相除 array([[0.1, 0.2, 0.3],[0.4, 0.5, 0.6]])1.5 ndarray 的索引和切片
1.5.1 整數(shù)索引和切片的基本使用
我們一起來(lái)來(lái)總結(jié)一下,看下面切片取值方式(對(duì)應(yīng)顏色是取出來(lái)的結(jié)果):
import numpy as np arr = np.arange(8) # 創(chuàng)建一個(gè)一維數(shù)組 arr array([0, 1, 2, 3, 4, 5, 6, 7]) arr[5] # 獲取索引為5的元素 5 arr[3:5] # 獲取索引為3~5的元素,但不包括5 array([3, 4]) arr[1:6:2] # 獲取索引為1~6的元素,步長(zhǎng)為2 array([1, 3, 5]) import numpy as np arr2d = np.array([[1, 2, 3],[4, 5, 6],[7, 8, 9]]) # 創(chuàng)建二維數(shù)組 arr2d array([[1, 2, 3],[4, 5, 6],[7, 8, 9]]) arr2d[1] # 獲取索引為1的元素 array([4, 5, 6]) arr2d[0, 1] # 獲取位于第0行第1列的元素 2 arr2d[:2] array([[1, 2, 3],[4, 5, 6]]) arr2d[0:2, 0:2] array([[1, 2],[4, 5]]) arr2d[1, :2] array([4, 5])1.5.2 花式(數(shù)組)索引的基本使用
import numpy as np demo_arr = np.empty((4, 4)) # 創(chuàng)建一個(gè)空數(shù)組 for i in range(4):demo_arr[i] = np.arange(i, i + 4) # 動(dòng)態(tài)地為數(shù)組添加元素 demo_arr array([[0., 1., 2., 3.],[1., 2., 3., 4.],[2., 3., 4., 5.],[3., 4., 5., 6.]]) demo_arr[[0, 2]] # 獲取索引為[0,2]的元素 array([[0., 1., 2., 3.],[2., 3., 4., 5.]]) demo_arr[[1, 3], [1, 2]] # 獲取索引為(1,1)和(3,2)的元素 array([2., 5.])1.5.3 布爾型
# 存儲(chǔ)學(xué)生姓名的數(shù)組 student_name = np.array(['Tom', 'Lily', 'Jack', 'Rose']) student_name array(['Tom', 'Lily', 'Jack', 'Rose'], dtype='<U4') # 存儲(chǔ)學(xué)生成績(jī)的數(shù)組 student_score = np.array([[79, 88, 80], [89, 90, 92], [83, 78, 85], [78, 76, 80]]) student_score array([[79, 88, 80],[89, 90, 92],[83, 78, 85],[78, 76, 80]]) # 對(duì)student_name和字符串“Jack”通過(guò)運(yùn)算符產(chǎn)生一個(gè)布爾型數(shù)組 student_name == 'Jack' array([False, False, True, False]) # 將布爾數(shù)組作為索引應(yīng)用于存儲(chǔ)成績(jī)的數(shù)組student_score, # 返回的數(shù)據(jù)是True值對(duì)應(yīng)的行 student_score[student_name=='Jack'] array([[83, 78, 85]]) student_score[student_name=='Jack', :1] array([[83]])1.6 數(shù)組的轉(zhuǎn)置和軸對(duì)稱
arr = np.arange(12).reshape(3, 4) arr array([[ 0, 1, 2, 3],[ 4, 5, 6, 7],[ 8, 9, 10, 11]]) arr.T # 使用T屬性對(duì)數(shù)組進(jìn)行轉(zhuǎn)置 array([[ 0, 4, 8],[ 1, 5, 9],[ 2, 6, 10],[ 3, 7, 11]]) arr = np.arange(16).reshape((2, 2, 4)) arr array([[[ 0, 1, 2, 3],[ 4, 5, 6, 7]],[[ 8, 9, 10, 11],[12, 13, 14, 15]]]) arr.transpose(1, 2, 0) # 使用transpose()方法對(duì)數(shù)組進(jìn)行轉(zhuǎn)置 array([[[ 0, 8],[ 1, 9],[ 2, 10],[ 3, 11]],[[ 4, 12],[ 5, 13],[ 6, 14],[ 7, 15]]]) arr array([[[ 0, 1, 2, 3],[ 4, 5, 6, 7]],[[ 8, 9, 10, 11],[12, 13, 14, 15]]]) arr.swapaxes(1, 0) # 使用swapaxes方法對(duì)數(shù)組進(jìn)行轉(zhuǎn)置 array([[[ 0, 1, 2, 3],[ 8, 9, 10, 11]],[[ 4, 5, 6, 7],[12, 13, 14, 15]]])1.7 NumPy 通用函數(shù)
arr = np.array([4, 9, 16]) np.sqrt(arr)#開(kāi)方 array([2., 3., 4.]) np.abs(arr)#求絕對(duì)值 array([ 4, 9, 16]) np.square(arr)#求平方 array([ 16, 81, 256], dtype=int32) x = np.array([12, 9, 13, 15]) y = np.array([11, 10, 4, 8]) np.add(x, y) # 計(jì)算兩個(gè)數(shù)組的和 array([23, 19, 17, 23]) np.multiply(x, y) # 計(jì)算兩個(gè)數(shù)組的乘積 array([132, 90, 52, 120]) np.maximum(x, y) # 兩個(gè)數(shù)組元素級(jí)最大值的比較 array([12, 10, 13, 15]) np.greater(x, y) # 執(zhí)行元素級(jí)的比較操作 array([ True, False, True, True])1.8 利用 NumPy 數(shù)組進(jìn)行數(shù)據(jù)處理
1.8.1 將條件邏輯轉(zhuǎn)為數(shù)組運(yùn)算
arr_x = np.array([1, 5, 7]) arr_y = np.array([2, 6, 8]) arr_con = np.array([True, False, True]) result = np.where(arr_con, arr_x, arr_y) result array([1, 6, 7])1.8.2 數(shù)組統(tǒng)計(jì)運(yùn)算
arr = np.arange(10) arr.sum() # 求和 45 arr.mean() # 求平均值 4.5 arr.min() # 求最小值 0 arr.max() # 求最大值 9 arr.argmin() # 求最小值的索引 0 arr.argmax() # 求最大值的索引 9 arr.cumsum() # 計(jì)算元素的累計(jì)和 array([ 0, 1, 3, 6, 10, 15, 21, 28, 36, 45], dtype=int32) arr.cumprod() # 計(jì)算元素的累計(jì)積 array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0], dtype=int32) x = np.arange(1 , 16).reshape((3 , 5)) print(x) [[ 1 2 3 4 5][ 6 7 8 9 10][11 12 13 14 15]] np.diff(x,axis=1) #默認(rèn)axis=1 array([[1, 1, 1, 1],[1, 1, 1, 1],[1, 1, 1, 1]]) np.diff(x,axis=0) array([[5, 5, 5, 5, 5],[5, 5, 5, 5, 5]]) np.floor([-0.6,-1.4,-0.1,-1.8,0,1.4,1.7]) array([-1., -2., -1., -2., 0., 1., 1.])看到?jīng)],負(fù)數(shù)取整,跟上述的 around 一樣,是向左!
np.ceil([1.2,1.5,1.8,2.1,2.0,-0.5,-0.6,-0.3]) array([ 2., 2., 2., 3., 2., -0., -0., -0.])取上限!找這個(gè)小數(shù)的最大整數(shù)即可!
查找,利用 np.where 實(shí)現(xiàn)小于 0 的值用 0 填充嗎,大于 0 的數(shù)不變!
x = np.array([[1, 0],[2, -2],[-2, 1]]) print(x) [[ 1 0][ 2 -2][-2 1]] np.where(x>0,x,0) array([[1, 0],[2, 0],[0, 1]])1.8.3 數(shù)組排序
arr = np.array([[6, 2, 7], [3, 6, 2], [4, 3, 2]]) arr array([[6, 2, 7],[3, 6, 2],[4, 3, 2]]) arr.sort() arr array([[2, 6, 7],[2, 3, 6],[2, 3, 4]]) arr = np.array([[6, 2, 7], [3, 6, 2], [4, 3, 2]]) arr array([[6, 2, 7],[3, 6, 2],[4, 3, 2]]) arr.sort(0) # 沿著編號(hào)為0的軸對(duì)元素排序 arr array([[3, 2, 2],[4, 3, 2],[6, 6, 7]])1.8.4 檢索數(shù)組元素
arr = np.array([[1, -2, -7], [-3, 6, 2], [-4, 3, 2]]) arr array([[ 1, -2, -7],[-3, 6, 2],[-4, 3, 2]]) np.any(arr > 0) # arr的所有元素是否有一個(gè)大于0 True np.all(arr > 0) # arr的所有元素是否都大于0 False1.8.5 唯一化及其他集合邏輯
arr = np.array([12, 11, 34, 23, 12, 8, 11]) np.unique(arr) array([ 8, 11, 12, 23, 34]) np.in1d(arr, [11, 12]) array([ True, True, False, False, True, False, True])1.9 線性代數(shù)模塊
arr_x = np.array([[1, 2, 3], [4, 5, 6]]) arr_y = np.array([[1, 2], [3, 4], [5, 6]]) arr_x.dot(arr_y) # 等價(jià)于np.dot(arr_x, arr_y) array([[22, 28],[49, 64]])1.10 隨機(jī)數(shù)模塊
import numpy as np np.random.rand(3, 3) # 隨機(jī)生成一個(gè)二維數(shù)組 array([[0.90422833, 0.57874299, 0.36084718],[0.46674697, 0.59189161, 0.88876503],[0.51836003, 0.30765097, 0.79668824]]) np.random.rand(2, 3, 3) # 隨機(jī)生成一個(gè)三維數(shù)組 array([[[0.21438832, 0.58877977, 0.86120009],[0.15222229, 0.53060997, 0.0562486 ],[0.88035435, 0.32505223, 0.9045713 ]],[[0.32907094, 0.88987195, 0.34523123],[0.90645746, 0.61257549, 0.83944649],[0.2015535 , 0.84522463, 0.87759584]]]) import numpy as np np.random.seed(0) # 生成隨機(jī)數(shù)的種子 np.random.rand(5) # 隨機(jī)生成包含5個(gè)元素的浮點(diǎn)數(shù)組 array([0.5488135 , 0.71518937, 0.60276338, 0.54488318, 0.4236548 ]) np.random.seed(0) np.random.rand(5) array([0.5488135 , 0.71518937, 0.60276338, 0.54488318, 0.4236548 ]) np.random.seed() np.random.rand(5) array([0.19299506, 0.41434116, 0.90011257, 0.37469705, 0.69775797])備注:本文代碼可以在github下載
https://github.com/fengdu78/Data-Science-Notes/tree/master/2.numpy
往期精彩回顧 那些年做的學(xué)術(shù)公益-你不是一個(gè)人在戰(zhàn)斗適合初學(xué)者入門人工智能的路線及資料下載機(jī)器學(xué)習(xí)在線手冊(cè)備注:加入本站微信群或者qq群,請(qǐng)回復(fù)“加群”加入知識(shí)星球(4500+用戶,ID:92416895),請(qǐng)回復(fù)“知識(shí)星球”總結(jié)
以上是生活随笔為你收集整理的AI基础:Numpy简易入门的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 深度学习笔记 第五门课 序列模型 第二周
- 下一篇: 而立之年,不拼体力的我们应该关注什么?