摘要:是什么今天開始會陸續(xù)為大家?guī)頂?shù)據(jù)科學(xué)常用包的基礎(chǔ)用法數(shù)據(jù)分析的工作涉及到大量的數(shù)值運算,一個高效方便的科學(xué)計算工具是必不可少的。
NumPy是什么?
今天開始會陸續(xù)為大家?guī)頂?shù)據(jù)科學(xué)常用包的基礎(chǔ)用法
數(shù)據(jù)分析的工作涉及到大量的數(shù)值運算,一個高效方便的科學(xué)計算工具是必不可少的。Python語言一開始并不是設(shè)計為科學(xué)計算使用的語言,隨著越來越多的人發(fā)現(xiàn)Python的易用性,逐漸出現(xiàn)了關(guān)于Python的大量外部擴展,Numpy (Numeric Python)就是其中之一。
Numpy提供了大量的數(shù)值編程工具,可以方便地處理向量、矩陣等運算,極大地便利了人們在科學(xué)計算方面的工作。另一方面,Python是免費,相比于花費高額的費用使用Matlab,Numpy的出現(xiàn)使Python得到了更多人的青睞。
我們可以簡單看一下如何開始使用NumPy:
import numpy as np numpy.version.full_version
"1.16.4"二、NumPy對象:數(shù)組
NumPy中的基本對象是同類型的多維數(shù)組(homogeneous multidimensional array),這和C++中的數(shù)組是一致的,例如字符型和數(shù)值型就不可共存于同一個數(shù)組中。先上例子:
a = np.arange(20) print(a)
[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19]
這里我們生成了一個一維數(shù)組a,從0開始,步長為1,長度為20。Python中的計數(shù)是從0開始的,R和Matlab的使用者需要小心。
我們可以通過"type"函數(shù)查看a的類型,這里顯示a是一個array:
type(a)
numpy.ndarray
通過函數(shù)"reshape",我們可以重新構(gòu)造一下這個數(shù)組,例如,我們可以構(gòu)造一個4*5的二維數(shù)組,其中"reshape"的參數(shù)表示各維度的大小,且按各維順序排列(兩維時就是按行排列,這和R中按列是不同的):
a = a.reshape(4, 5) print(a)
[[ 0 1 2 3 4] [ 5 6 7 8 9] [10 11 12 13 14] [15 16 17 18 19]]
構(gòu)造更高維的也沒問題:
a = a.reshape(2, 2, 5) print(a)
[[[ 0 1 2 3 4] [ 5 6 7 8 9]] [[10 11 12 13 14] [15 16 17 18 19]]]
既然a是array,我們還可以調(diào)用array的函數(shù)進一步查看a的相關(guān)屬性:"ndim"查看維度;"shape"查看各維度的大??;"size"查看全部的元素個數(shù),等于各維度大小的乘積;"dtype"可查看元素類型;"dsize"查看元素占位(bytes)大小。
a.ndim
3
a.shape
(2, 2, 5)
a.size
20
a.dtype
dtype("int32")三、創(chuàng)建數(shù)組
數(shù)組的創(chuàng)建可通過轉(zhuǎn)換列表實現(xiàn),高維數(shù)組可通過轉(zhuǎn)換嵌套列表實現(xiàn):
raw = [0,1,2,3,4] a = np.array(raw) a
array([0, 1, 2, 3, 4])
raw = [[0,1,2,3,4], [5,6,7,8,9]] b = np.array(raw) b
array([[0, 1, 2, 3, 4], [5, 6, 7, 8, 9]])
一些特殊的數(shù)組有特別定制的命令生成,如4*5的全零矩陣:
d = (4, 5) np.zeros(d)
array([[0., 0., 0., 0., 0.], [0., 0., 0., 0., 0.], [0., 0., 0., 0., 0.], [0., 0., 0., 0., 0.]])
默認生成的類型是浮點型,可以通過指定類型改為整型:
d = (4, 5) np.ones(d, dtype=int)
array([[1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1]])
[0, 1)區(qū)間的隨機數(shù)數(shù)組:
np.random.rand(5)
array([0.80378557, 0.09833667, 0.95280995, 0.17707594, 0.80651926])
服從正態(tài)分布的隨機數(shù)組:
np.random.randn(5)
array([ 0.678737 , -1.14965615, -1.40492579, 1.22479651, 0.2751816 ])四、數(shù)組操作
簡單的四則運算已經(jīng)重載過了,全部的"+","-","*","/"運算都是基于全部的數(shù)組元素的,以加法為例:
a = np.array([[1.0, 2], [2, 4]]) print ("a: ",a) b = np.array([[3.2, 1.5], [2.5, 4]]) print ("b: ",b) print ("a+b: ",a+b)
a: [[1. 2.] [2. 4.]] b: [[3.2 1.5] [2.5 4. ]] a+b: [[4.2 3.5] [4.5 8. ]]
這里可以發(fā)現(xiàn),a中雖然僅有一個與元素是浮點數(shù),其余均為整數(shù),在處理中Python會自動將整數(shù)轉(zhuǎn)換為浮點數(shù)(因為數(shù)組是同質(zhì)的),并且,兩個二維數(shù)組相加要求各維度大小相同。當(dāng)然,NumPy里這些運算符也可以對標量和數(shù)組操作,結(jié)果是數(shù)組的全部元素對應(yīng)這個標量進行運算,還是一個數(shù)組:
print ("3 * a ",3*a) print ("b + 1.8 ",b )
3 * a : [[ 3. 6.] [ 6. 12.]] b + 1.8 [[3.2 1.5] [2.5 4. ]]
類似C++,"+="、"-="、"*="、"/="操作符在NumPy中同樣支持:
a /= 2 a
array([[0.5, 1. ], [1. , 2. ]])
開根號求指數(shù)也很容易:
print(a)
[[0.5 1. ] [1. 2. ]]
print ("np.exp: ",np.exp(a))
np.exp: [[1.64872127 2.71828183] [2.71828183 7.3890561 ]]
print ("np.sqrt: ",np.sqrt(a))
np.sqrt: [[0.70710678 1. ] [1. 1.41421356]]
print ("np.square: ",np.square(a))
np.square: [[0.25 1. ] [1. 4. ]]
print ("np.power: ",np.power(a,3))
np.power: [[0.125 1. ] [1. 8. ]]
需要知道二維數(shù)組的最大最小值怎么辦?想計算全部元素的和、按行求和、按列求和怎么辦?NumPy的ndarray類已經(jīng)做好函數(shù)了:
a = np.arange(20).reshape(4,5) a
array([[ 0, 1, 2, 3, 4], [ 5, 6, 7, 8, 9], [10, 11, 12, 13, 14], [15, 16, 17, 18, 19]])
print("sum of all elements in a: " + str(a.sum())) print("maximum element in a: " + str(a.max())) print("minimum element in a: " + str(a.min())) print("maximum element in each row of a: " + str(a.max(axis=1))) print("minimum element in each column of a: " + str(a.min(axis=0)))
sum of all elements in a: 190 maximum element in a: 19 minimum element in a: 0 maximum element in each row of a: [ 4 9 14 19] minimum element in each column of a: [0 1 2 3 4]
科學(xué)計算中大量使用到矩陣運算,除了數(shù)組,NumPy同時提供了矩陣對象(matrix)。矩陣對象和數(shù)組的主要有兩點差別:一是矩陣是二維的,而數(shù)組的可以是任意正整數(shù)維;二是矩陣的"*"操作符進行的是矩陣乘法,乘號左側(cè)的矩陣列和乘號右側(cè)的矩陣行要相等,而在數(shù)組中"*"操作符進行的是每一元素的對應(yīng)相乘,乘號兩側(cè)的數(shù)組每一維大小需要一致。數(shù)組可以通過asmatrix或者mat轉(zhuǎn)換為矩陣,或者直接生成也可以:
a = np.arange(20).reshape(4, 5) a = np.asmatrix(a) print(type(a)) b = np.matrix("1.0 2.0; 3.0 4.0") print(type(b))
再來看一下矩陣的乘法,這使用arange生成另一個矩陣b,arange函數(shù)還可以通過arange(起始,終止,步長)的方式調(diào)用生成等差數(shù)列,注意含頭不含尾。
b = np.arange(2, 45, 3).reshape(5, 3) b = np.mat(b) print(b)
[[ 2 5 8] [11 14 17] [20 23 26] [29 32 35] [38 41 44]]
回到我們的問題,矩陣a和b做矩陣乘法:
print ("matrix a: ",a) print("matrix b: ",b) c = a * b print("matrix c: ",c)
matrix a: [[ 0 1 2 3 4] [ 5 6 7 8 9] [10 11 12 13 14] [15 16 17 18 19]] matrix b: [[ 2 5 8] [11 14 17] [20 23 26] [29 32 35] [38 41 44]] matrix c: [[ 290 320 350] [ 790 895 1000] [1290 1470 1650] [1790 2045 2300]]五、數(shù)組元素訪問
數(shù)組和矩陣元素的訪問可通過下標進行,以下均以二維數(shù)組(或矩陣)為例:
a = np.array([[3.2, 1.5], [2.5, 4]]) print(a[0][1]) print(a[0, 1])
1.5 1.5
可以通過下標訪問來修改數(shù)組元素的值:
b = a a[0][1] = 2.0 print(a) print(b)
[[3.2 2. ] [2.5 4. ]] [[3.2 2. ] [2.5 4. ]]
現(xiàn)在問題來了,明明改的是a0,怎么連b0也跟著變了?這個陷阱在Python編程中很容易碰上,其原因在于Python不是真正將a復(fù)制一份給b,而是將b指到了a對應(yīng)數(shù)據(jù)的內(nèi)存地址上。想要真正的復(fù)制一份a給b,可以使用copy:
a = np.array([[3.2, 1.5], [2.5, 4]]) b = a.copy() a[0][1] = 2.0 print ("a:",a) print ("b:",b)
a: [[3.2 2. ] [2.5 4. ]] b: [[3.2 1.5] [2.5 4. ]]
若對a重新賦值,即將a指到其他地址上,b仍在原來的地址上:
a = np.array([[3.2, 1.5], [2.5, 4]]) b = a a = np.array([[2, 1], [9, 3]]) print ("a: ",a) print ("b: ",b)
a: [[2 1] [9 3]] b: [[3.2 1.5] [2.5 4. ]]
利用":"可以訪問到某一維的全部數(shù)據(jù),例如取矩陣中的指定列:
a = np.arange(20).reshape(4, 5) print ("a: ",a) print ("the 2nd and 4th column of a:: ",a[:,[1,3]])
a: [[ 0 1 2 3 4] [ 5 6 7 8 9] [10 11 12 13 14] [15 16 17 18 19]] the 2nd and 4th column of a:: [[ 1 3] [ 6 8] [11 13] [16 18]]
稍微復(fù)雜一些,我們嘗試取出滿足某些條件的元素,這在數(shù)據(jù)的處理中十分常見,通常用在單行單列上。下面這個例子是將第一列大于5的元素(10和15)對應(yīng)的第三列元素(12和17)取出來:
a[:, 2][a[:, 0] > 5]
array([12, 17])
可使用where函數(shù)查找特定值在數(shù)組中的位置:
loc = numpy.where(a==11) print(loc) print(a[loc[0][0], loc[1][0]])
(array([2], dtype=int64), array([1], dtype=int64)) 11六、數(shù)組操作
還是拿矩陣(或二維數(shù)組)作為例子,首先來看矩陣轉(zhuǎn)置:
a = np.random.rand(2,4) print ("a: ",a) a = np.transpose(a) print ("a is an array, by using transpose(a): ",a) b = np.random.rand(2,4) b = np.mat(b) print ("b: ",b) print ("b is a matrix, by using b.T: ",b.T)
a: [[0.49632956 0.65061015 0.36037379 0.29664563] [0.18319505 0.45525932 0.08422801 0.75167911]] a is an array, by using transpose(a): [[0.49632956 0.18319505] [0.65061015 0.45525932] [0.36037379 0.08422801] [0.29664563 0.75167911]] b: [[0.51087064 0.2058778 0.88659661 0.78428426] [0.62716285 0.46838085 0.63015861 0.69754748]] b is a matrix, by using b.T: [[0.51087064 0.62716285] [0.2058778 0.46838085] [0.88659661 0.63015861] [0.78428426 0.69754748]]
矩陣求逆:
import numpy.linalg as nlg a = np.random.rand(2,2) print ("a: ",a) ia = nlg.inv(a) print ("inverse of a: ",ia) print ("a * inv(a): ",a * ia)
a: [[0.7748124 0.08125528] [0.99696367 0.73251292]] inverse of a: [[ 1.50551971 -0.16700242] [-2.04904025 1.59245703]] a * inv(a): [[ 1.16649535 -0.01356983] [-2.04281868 1.16649535]]
求特征值和特征向量
a = np.random.rand(3,3) eig_value, eig_vector = nlg.eig(a) print ("eigen value: ",eig_value) print ("eigen vector: ",eig_vector)
eigen value: [ 1.75590394+0.j -0.25188941+0.08867887j -0.25188941-0.08867887j] eigen vector: [[ 0.33976986+0.j 0.47679494-0.21597791j 0.47679494+0.21597791j] [ 0.81509742+0.j 0.24255425+0.21077809j 0.24255425-0.21077809j] [ 0.46922557+0.j -0.78915154+0.j -0.78915154-0.j ]]
按列拼接兩個向量成一個矩陣:
a = np.array((1,2,3)) b = np.array((2,3,4)) print(np.column_stack((a,b)))
[[1 2] [2 3] [3 4]]
在循環(huán)處理某些數(shù)據(jù)得到結(jié)果后,將結(jié)果拼接成一個矩陣是十分有用的,可以通過vstack和hstack完成:
a = np.random.rand(2,2) b = np.random.rand(2,2) print ("a: ",a) print ("b: ",b) c = np.hstack([a,b]) d = np.vstack([a,b]) print("horizontal stacking a and b: ",c) print("vertical stacking a and b: ",d)
a: [[0.50331973 0.49651025] [0.89325327 0.31245265]] b: [[0.35846554 0.56841584] [0.88041789 0.81287829]] horizontal stacking a and b: [[0.50331973 0.49651025 0.35846554 0.56841584] [0.89325327 0.31245265 0.88041789 0.81287829]] vertical stacking a and b: [[0.50331973 0.49651025] [0.89325327 0.31245265] [0.35846554 0.56841584] [0.88041789 0.81287829]]七、缺失值
缺失值在分析中也是信息的一種,NumPy提供nan作為缺失值的記錄,通過isnan判定。
a = np.random.rand(2,2) a[0, 1] = np.nan print(np.isnan(a))
[[False True] [False False]]
nan_to_num可用來將nan替換成0,pandas中提供能指定nan替換值的函數(shù)。
print(np.nan_to_num(a))
[[0.04279427 0. ] [0.08386045 0.3567586 ]]參考文獻
http://wiki.scipy.org/Tentati...
Sheppard K. Introduction to Python for econometrics, statistics and data analysis. Self-published, University of Oxford, version, 2012, 2.
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/45210.html
摘要:安裝安裝用于數(shù)據(jù)科學(xué)的的最佳方法是使用發(fā)行版。但這只是展示了構(gòu)建數(shù)據(jù)科學(xué)問題的不同方式中的機器學(xué)習(xí)這是一個重要的主題,機器學(xué)習(xí)正在風(fēng)靡世界,是數(shù)據(jù)科學(xué)家工作的重要組成部分。 作為編程界的頭牌名媛,Python平易近人的態(tài)度和精明婉約的靈動深得各個大佬歡心。比如:人工智能、web開發(fā)、爬蟲、系統(tǒng)運維、數(shù)據(jù)分析與計算等等。這幾位風(fēng)流多金的行業(yè)精英隨便哪個都能逆轉(zhuǎn)未來。 本文為你精心準備了一...
摘要:從本博客開始,將系統(tǒng)的學(xué)習(xí)的數(shù)據(jù)分析的六大模塊,有關(guān)的基礎(chǔ)知識,可以看我的博客。專為進行嚴格的數(shù)字處理而產(chǎn)生。在實現(xiàn)一個程序之前,值得檢查下所需的數(shù)據(jù)處理方式是否已經(jīng)在中存在了。積分六官網(wǎng)為了解決數(shù)據(jù)分析而創(chuàng)建的庫。 從本博客開始,將系統(tǒng)的學(xué)習(xí)Python的數(shù)據(jù)分析的六大模塊numpy、scipy、matplotlib、pandas、scikit-learn、keras,有關(guān)Pytho...
摘要:開發(fā)指南開發(fā)指南開發(fā)指南如果使用進行機器學(xué)習(xí)方面的數(shù)據(jù)分析,需要在集群上安裝一些依賴包。以版本為例,安裝方法如下是一款專為科學(xué)和工程設(shè)計的工具包。以版本為例,安裝方法如下是下,專門面向機器學(xué)習(xí)的工具包。 developer/pythondev.mdPython開發(fā)指南如果使用pyspark進行機器學(xué)習(xí)方面的數(shù)據(jù)分析,需要在集群上安裝一些python依賴包。這里將介紹常用的幾個依賴包的安裝方法...
摘要:在本節(jié)中,我們將看到一些最流行和最常用的庫,用于機器學(xué)習(xí)和深度學(xué)習(xí)是用于數(shù)據(jù)挖掘,分析和機器學(xué)習(xí)的最流行的庫。愿碼提示網(wǎng)址是一個基于的框架,用于使用多個或進行有效的機器學(xué)習(xí)和深度學(xué)習(xí)。 showImg(https://segmentfault.com/img/remote/1460000018961827?w=999&h=562); 來源 | 愿碼(ChainDesk.CN)內(nèi)容編輯...
摘要:學(xué)習(xí)利器我的小白安裝之路序易用,但用好卻不易,其中比較頭疼的就是包管理和不同版本的問題,特別是當(dāng)你使用的時候。另外值得一提的是,并不僅僅管理的工具包,它也能安裝非的包。 Python學(xué)習(xí)利器——我的小白 Anaconda安裝之路 序 Python易用,但用好卻不易,其中比較頭疼的就是包管理和Python不同版本的問題,特別是當(dāng)你使用Windows的時候。為了解決這些問題,有不少發(fā)行版的...
閱讀 3542·2021-10-09 09:41
閱讀 2745·2021-10-08 10:18
閱讀 2183·2021-09-10 10:51
閱讀 2680·2021-09-10 10:50
閱讀 776·2021-09-09 09:33
閱讀 3383·2021-09-06 15:14
閱讀 3017·2019-08-30 11:06
閱讀 3248·2019-08-29 14:04