如何進(jìn)行Python Numpy的入門,相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。
創(chuàng)新互聯(lián),專注為中小企業(yè)提供官網(wǎng)建設(shè)、營銷型網(wǎng)站制作、響應(yīng)式網(wǎng)站開發(fā)、展示型做網(wǎng)站、成都網(wǎng)站建設(shè)等服務(wù),幫助中小企業(yè)通過網(wǎng)站體現(xiàn)價值、有效益。幫助企業(yè)快速建站、解決網(wǎng)站建設(shè)與網(wǎng)站營銷推廣問題。Numpy是python語言中最基礎(chǔ)和最強(qiáng)大的科學(xué)計算和數(shù)據(jù)處理的工具包,如數(shù)據(jù)分析工具pandas也是基于numpy構(gòu)建的,機(jī)器學(xué)習(xí)包scikit-learn也大量使用了numpy方法。本文介紹了Numpy的n維數(shù)組在數(shù)據(jù)處理和分析的所有核心應(yīng)用。
1.如何構(gòu)建numpy數(shù)組
構(gòu)建numpy數(shù)組的方法很多,比較常用的方法是用np.array函數(shù)對列表進(jìn)行轉(zhuǎn)化。
# 通過列表創(chuàng)建一維數(shù)組 import numpy as np list1 = [0,1,2,3,4] arr1d = np.array(list1) #打印數(shù)組和類型 print(type(arr1d)) arr1d <type 'numpy.ndarray'> [0 1 2 3 4]
數(shù)組和列表最關(guān)鍵的區(qū)別是:數(shù)組是基于向量化操作的,列表不是,我們在實際項目中處理的數(shù)據(jù)一般是矩陣結(jié)構(gòu),對該數(shù)據(jù)以行向量或列向量的形式進(jìn)行計算,向量計算是基于數(shù)組實現(xiàn)的,因此數(shù)組比列表的應(yīng)用更廣。
函數(shù)可以應(yīng)用到數(shù)組的每一項,列表不行。
比如,不可以對列表的每一項數(shù)據(jù)都加2,這是錯誤的。
list1 + 2 # 錯誤
可以對數(shù)組的某一項數(shù)據(jù)都加2
# Add 2 to each element of arr1d arr1d + 2 #> array([2, 3, 4, 5, 6])
另一個區(qū)別是已經(jīng)定義的numpy數(shù)組不可以增加數(shù)組大小,只能通過定義另一個數(shù)組來實現(xiàn),但是列表可以增加大小。
然而,Numpy有更多的優(yōu)勢,讓我們一起來發(fā)現(xiàn)。
numpy可以通過列表中的列表來構(gòu)建二維數(shù)組。
# Create a 2d array from a list of lists list2 = [[0,1,2], [3,4,5], [6,7,8]] arr2d = np.array(list2) arr2d #> array([[0, 1, 2], #> [3, 4, 5], #> [6, 7, 8]])
你也可以通過dtype參數(shù)指定數(shù)組的類型,一些最常用的numpy類型是:'float','int','bool','str'和'object'。
# Create a float 2d array arr2d_f = np.array(list2, dtype='float') arr2d_f #> array([[ 0., 1., 2.], #> [ 3., 4., 5.], #> [ 6., 7., 8.]])
輸出結(jié)果的小數(shù)點表示float類型,你也可以通過 astype方法轉(zhuǎn)換成不同的類型。
# 轉(zhuǎn)換成‘int’類型 arr2d_f.astype('int') #> array([[0, 1, 2], #> [3, 4, 5], #> [6, 7, 8]]) # 先轉(zhuǎn)換‘int’類型,再轉(zhuǎn)換‘str’類型 arr2d_f.astype('int').astype('str') #> array([['0', '1', '2'], #> ['3', '4', '5'], #> ['6', '7', '8']], #> dtype='U21')
另一個區(qū)別是數(shù)組要求所有項是同一個類型,list沒有這個限制。如果你想要一個數(shù)組包含不同類型,設(shè)置‘dtype’為'object'。
# 構(gòu)建布爾類型數(shù)組 arr2d_b = np.array([1, 0, 10], dtype='bool') arr2d_b #> array([ True, False, True], dtype=bool) # 構(gòu)建包含數(shù)值和字符串的數(shù)組 arr1d_obj = np.array([1, 'a'], dtype='object') arr1d_obj #> array([1, 'a'], dtype=object)
最終使用 tolist()函數(shù)使數(shù)組轉(zhuǎn)化為列表。
# Convert an array back to a list arr1d_obj.tolist() #> [1, 'a']
總結(jié)數(shù)組和列表主要的區(qū)別:
數(shù)組支持向量化操作,列表不支持;
數(shù)組不能改變長度,列表可以;
數(shù)組的每一項都是同一類型,list可以有多種類型;
同樣長度的數(shù)組所占的空間小于列表;
2.如何觀察數(shù)組屬性的大小和形狀(shape)
一維數(shù)組由列表構(gòu)建,二維數(shù)組arr2d由列表的列表構(gòu)建,二維數(shù)組有行和列,比如矩陣,三維數(shù)組由嵌入了兩個列表的列表構(gòu)建。
假設(shè)給定一個數(shù)組,我們怎么去了解該數(shù)組的屬性。
數(shù)組的屬性包括:
數(shù)組的維度(ndim)
數(shù)組的形狀(shape)
數(shù)組的類型(dtype)
數(shù)組的大?。╯ize)
數(shù)組元素的表示(通過索引)
# 定義3行4列的二維數(shù)組 list2 = [[1, 2, 3, 4],[3, 4, 5, 6], [5, 6, 7, 8]] arr2 = np.array(list2, dtype='float') arr2 #> array([[ 1., 2., 3., 4.], #> [ 3., 4., 5., 6.], #> [ 5., 6., 7., 8.]]) # 形狀(shape) print('Shape: ', arr2.shape) # 數(shù)組類型(dtype) print('Datatype: ', arr2.dtype) # 數(shù)組大小(size) print('Size: ', arr2.size) # 數(shù)組維度(ndim) print('Num Dimensions: ', arr2.ndim) # 取數(shù)組第3行3列元素 print('items of 3 line 3 column: ', c[2,2]) #> Shape: (3, 4) #> Datatype: float64 #> Size: 12 #> Num Dimensions: 2 #> items of 3 line 3 column: 7
3. 如何從數(shù)組提取特定的項
數(shù)組的索引是從0開始計數(shù)的,與list類似。numpy數(shù)組通過方括號的參數(shù)以選擇特定的元素。
# 選擇矩陣的前兩行兩列 arr2[:2, :2] list2[:2, :2] # 錯誤 #> array([[ 1., 2.], #> [ 3., 4.]])
numpy數(shù)組支持布爾類型的索引,布爾型索引數(shù)組與過濾前(array-to-be-filtered)的數(shù)組大小相等,布爾型數(shù)組只包含Ture和False變量,Ture變量對應(yīng)的數(shù)組索引位置保留了過濾前的值 。
arr2 #> array([[ 1., 2., 3., 4.], #> [ 3., 4., 5., 6.], #> [ 5., 6., 7., 8.]]) # 對數(shù)組每一個元素是否滿足某一條件,然后獲得布爾類型的輸出 b = arr2 > 4 b #> array([[False, False, False, False], #> [False, False, True, True], #> [ True, True, True, True]], dtype=bool) # 取布爾型數(shù)組保留的原始數(shù)組的值 arr2[b] #> array([ 5., 6., 5., 6., 7., 8.])
3.1 如何反轉(zhuǎn)數(shù)組
# 反轉(zhuǎn)數(shù)組的行 arr2[::-1, ] #> array([[ 5., 6., 7., 8.], #> [ 3., 4., 5., 6.], #> [ 1., 2., 3., 4.]]) # Reverse the row and column positions # 反轉(zhuǎn)數(shù)組的行和列 arr2[::-1, ::-1] #> array([[ 8., 7., 6., 5.], #> [ 6., 5., 4., 3.], #> [ 4., 3., 2., 1.]])
3.2 如何處理數(shù)組的缺失值(missing)和無窮大(infinite)值
缺失值可以用np.nan對象表示,np.inf表示無窮大值,下面用二維數(shù)組舉例:
# 插入nan變量和inf變量 arr2[1,1] = np.nan # not a number arr2[1,2] = np.inf # infinite arr2 #> array([[ 1., 2., 3., 4.], #> [ 3., nan, inf, 6.], #> [ 5., 6., 7., 8.]]) # 用-1代替nan值和inf值 missing_bool = np.isnan(arr2) | np.isinf(arr2) arr2[missing_bool] = -1 arr2 #> array([[ 1., 2., 3., 4.], #> [ 3., -1., -1., 6.], #> [ 5., 6., 7., 8.]])
3.3 如何計算n維數(shù)組的平均值,最小值和大值
# 平均值,大值,最小值 print("Mean value is: ", arr2.mean()) print("Max value is: ", arr2.max()) print("Min value is: ", arr2.min()) #> Mean value is: 3.58333333333 #> Max value is: 8.0 #> Min value is: -1.0
如果要求數(shù)組的行或列的最小值,使用np.amin函數(shù)
# Row wise and column wise min # 求數(shù)組行和列的最小值 # axis=0表示列,1表示行 print("Column wise minimum: ", np.amin(arr2, axis=0)) print("Row wise minimum: ", np.amin(arr2, axis=1)) #> Column wise minimum: [ 1. -1. -1. 4.] #> Row wise minimum: [ 1. -1. 5.]
對數(shù)組的每個元素進(jìn)行累加,得到一維數(shù)組,一維數(shù)組的大小與二維數(shù)組相同。
# 累加 np.cumsum(arr2) #> array([ 1., 3., 6., 10., 13., 12., 11., 17., 22., 28., 35., 43.])
4.如何從現(xiàn)有的數(shù)組定義新數(shù)組
如果使用賦值運(yùn)算符從父數(shù)組定義新數(shù)組,新數(shù)組與父數(shù)組共占同一個內(nèi)存空間,如果改變新數(shù)組的值,那么父數(shù)組也相應(yīng)的改變。
為了讓新數(shù)組與父數(shù)組相互獨(dú)立,你需要使用copy()函數(shù)。所有父數(shù)組都使用copy()方法構(gòu)建新數(shù)組。
# Assign portion of arr2 to arr2a. Doesn't really create a new array. # 分配arr2數(shù)組給新數(shù)組arr2a,下面方法并沒有定新數(shù)組 arr2a = arr2[:2,:2] arr2a[:1, :1] = 100 # arr2相應(yīng)位置也改變了 arr2 #> array([[ 100., 2., 3., 4.], #> [ 3., -1., -1., 6.], #> [ 5., 6., 7., 8.]]) # 賦值arr2數(shù)組的一部分給新數(shù)組arr2b arr2b = arr2[:2, :2].copy() arr2b[:1, :1] = 101 # arr2沒有改變 arr2 #> array([[ 100., 2., 3., 4.], #> [ 3., -1., -1., 6.], #> [ 5., 6., 7., 8.]])
5.多維數(shù)組的重構(gòu)(reshaping)和扁平(flattening)
重構(gòu)(reshaping)是改變了數(shù)組項的排列,即改變了數(shù)組的形狀,未改變數(shù)組的維數(shù)。
扁平(flattening)是對多維數(shù)組轉(zhuǎn)化為一維數(shù)組。
# 3x4數(shù)組重構(gòu)為4x3數(shù)組 arr2.reshape(4, 3) #> array([[ 100., 2., 3.], #> [ 4., 3., -1.], #> [ -1., 6., 5.], #> [ 6., 7., 8.]])
5.1 flatten()和ravel()的區(qū)別
數(shù)組的扁平化有兩種常用的方法,flatten()和ravel() 。flatten處理后的數(shù)組是父數(shù)組的引用,因此新數(shù)組的任何變化也會改變父數(shù)組,因其未用復(fù)制的方式構(gòu)建數(shù)組,內(nèi)存使用效率高,ravel通過復(fù)制的方式構(gòu)建新數(shù)組。
# flatten方法 arr2.flatten() #> array([ 100., 2., 3., 4., 3., -1., -1., 6., 5., 6., 7., 8.]) # flatten方法 b1 = arr2.flatten() b1[0] = 100 # 改變b1的值并未影響arr2 arr2 #> array([[ 100., 2., 3., 4.], #> [ 3., -1., -1., 6.], #> [ 5., 6., 7., 8.]]) # ravel方法 b2 = arr2.ravel() b2[0] = 101 # 改變b2值,相應(yīng)的改變了arr2值 arr2 #> array([[ 101., 2., 3., 4.], #> [ 3., -1., -1., 6.], #> [ 5., 6., 7., 8.]])
6.如何通過numpy生成序列數(shù)(sequences),重復(fù)數(shù)(repetitions)和隨機(jī)數(shù)(random)
np.arrange函數(shù)手動生成指定數(shù)目的序列數(shù),與ndarray作用一樣。
# 默認(rèn)下限為0 print(np.arange(5)) # 0 to 9,默認(rèn)步數(shù)為1 print(np.arange(0, 10)) # 遞增步數(shù)2 print(np.arange(0, 10, 2)) # 降序 print(np.arange(10, 0, -1)) #> [0 1 2 3 4] #> [0 1 2 3 4 5 6 7 8 9] #> [0 2 4 6 8] #> [10 9 8 7 6 5 4 3 2 1]
上例是通過np.arrange設(shè)置初始位置和結(jié)束位置來生成序列數(shù),如果我們設(shè)置數(shù)組的元素個數(shù),那么可以自動計算數(shù)組的遞增值。
如構(gòu)建1到50的數(shù)組,數(shù)組有10個元素,使用np.linspace總動計算數(shù)組的遞增值。
# 起始位置和結(jié)束位置分別為1和50 np.linspace(start=1, stop=50, num=10, dtype=int) #> array([ 1, 6, 11, 17, 22, 28, 33, 39, 44, 50])
我們注意到上面例子的遞增值并不相等,有5和6兩個值,原因是計算遞增值采用了四舍五入的算法(rounding)。與np.linspace類似,np.logspace以對數(shù)尺度的方式增長。
# 設(shè)置數(shù)組的精度為小數(shù)點后兩位 np.set_printoptions(precision=2) # 起點為 10^1 and 終點為 10^50,數(shù)組元素個數(shù)10,以10為底數(shù) np.logspace(start=1, stop=50, num=10, base=10) #> array([ 1.00e+01, 2.78e+06, 7.74e+11, 2.15e+17, 5.99e+22, #> 1.67e+28, 4.64e+33, 1.29e+39, 3.59e+44, 1.00e+50])
初始化數(shù)組的元素全為1或全為0。
np.zeros([2,2]) #> array([[ 0., 0.], #> [ 0., 0.]]) np.ones([2,2]) #> array([[ 1., 1.], #> [ 1., 1.]])
6.1如何構(gòu)建重復(fù)的序列數(shù)
np.tile重復(fù)整個的數(shù)組或列表n次,np.repeat重復(fù)數(shù)組每一項n次。 a = [1,2,3] # 重復(fù)數(shù)組a兩次 print('Tile: ', np.tile(a, 2)) # 重復(fù)數(shù)組a每項兩次 print('Repeat: ', np.repeat(a, 2)) #> Tile: [1 2 3 1 2 3] #> Repeat: [1 1 2 2 3 3]
6.2 如何生存隨機(jī)數(shù)
random模塊包含的函數(shù)可以生成任一數(shù)組形狀的隨機(jī)數(shù)和統(tǒng)計分布。
# 生成2行2列的[0,1)的隨機(jī)數(shù) print(np.random.rand(2,2)) # 生成均值為0方差為1的2行2列的正態(tài)分布值 print(np.random.randn(2,2)) # 生成[0,10)的2行2列的隨機(jī)整數(shù) print(np.random.randint(0, 10, size=[2,2])) # 生成一個[0,1)的隨機(jī)數(shù) print(np.random.random()) # 生成[0,1)的2行2列的隨機(jī)數(shù) print(np.random.random(size=[2,2])) # 從給定的列表等概率抽樣10次 print(np.random.choice(['a', 'e', 'i', 'o', 'u'], size=10)) # 從給定的列表和對應(yīng)的概率分布抽樣10次 print(np.random.choice(['a', 'e', 'i', 'o', 'u'], size=10, p=[0.3, .1, 0.1, 0.4, 0.1])) # picks more o's #> [[ 0.84 0.7 ] #> [ 0.52 0.8 ]] #> [[-0.06 -1.55] #> [ 0.47 -0.04]] #> [[4 0] #> [8 7]] #> 0.08737272424956832 #> [[ 0.45 0.78] #> [ 0.03 0.74]] #> ['i' 'a' 'e' 'e' 'a' 'u' 'o' 'e' 'i' 'u'] #> ['o' 'a' 'e' 'a' 'a' 'o' 'o' 'o' 'a' 'o']
6.3 如何得到數(shù)組獨(dú)特(unique)的項和個數(shù)(counts)
np.unique函數(shù)去除數(shù)組中重復(fù)的元素,設(shè)置return_counts參數(shù)為True,得到數(shù)組每一項的個數(shù)。
# 定義范圍為[0,10),個數(shù)為10的隨機(jī)整數(shù)數(shù)組 np.random.seed(100) arr_rand = np.random.randint(0, 10, size=10) print(arr_rand) #> [8 8 3 7 7 0 4 2 5 2] # 得到數(shù)組獨(dú)特的項和相應(yīng)的個數(shù) uniqs, counts = np.unique(arr_rand, return_counts=True) print("Unique items : ", uniqs) print("Counts : ", counts) #> Unique items : [0 2 3 4 5 7 8] #> Counts : [1 2 1 1 1 2 2]
對numpy的基本用法不太熟悉的伙伴,重點可以看一下了!
看完上述內(nèi)容,你們掌握如何進(jìn)行Python Numpy的入門的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道,感謝各位的閱讀!
網(wǎng)頁名稱:如何進(jìn)行PythonNumpy的入門-創(chuàng)新互聯(lián)
文章轉(zhuǎn)載:http://www.rwnh.cn/article16/dghhgg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供動態(tài)網(wǎng)站、網(wǎng)站維護(hù)、移動網(wǎng)站建設(shè)、營銷型網(wǎng)站建設(shè)、定制網(wǎng)站、網(wǎng)站內(nèi)鏈
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容