摘要:是什么今天開(kāi)始會(huì)陸續(xù)為大家?guī)?lái)數(shù)據(jù)科學(xué)常用包的基礎(chǔ)用法數(shù)據(jù)分析的工作涉及到大量的數(shù)值運(yùn)算,一個(gè)高效方便的科學(xué)計(jì)算工具是必不可少的。
NumPy是什么?
今天開(kāi)始會(huì)陸續(xù)為大家?guī)?lái)數(shù)據(jù)科學(xué)常用包的基礎(chǔ)用法
數(shù)據(jù)分析的工作涉及到大量的數(shù)值運(yùn)算,一個(gè)高效方便的科學(xué)計(jì)算工具是必不可少的。Python語(yǔ)言一開(kāi)始并不是設(shè)計(jì)為科學(xué)計(jì)算使用的語(yǔ)言,隨著越來(lái)越多的人發(fā)現(xiàn)Python的易用性,逐漸出現(xiàn)了關(guān)于Python的大量外部擴(kuò)展,Numpy (Numeric Python)就是其中之一。
Numpy提供了大量的數(shù)值編程工具,可以方便地處理向量、矩陣等運(yùn)算,極大地便利了人們?cè)诳茖W(xué)計(jì)算方面的工作。另一方面,Python是免費(fèi),相比于花費(fèi)高額的費(fèi)用使用Matlab,Numpy的出現(xiàn)使Python得到了更多人的青睞。
我們可以簡(jiǎn)單看一下如何開(kāi)始使用NumPy:
import numpy as np numpy.version.full_version
"1.16.4"二、NumPy對(duì)象:數(shù)組
NumPy中的基本對(duì)象是同類型的多維數(shù)組(homogeneous multidimensional array),這和C++中的數(shù)組是一致的,例如字符型和數(shù)值型就不可共存于同一個(gè)數(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]
這里我們生成了一個(gè)一維數(shù)組a,從0開(kāi)始,步長(zhǎng)為1,長(zhǎng)度為20。Python中的計(jì)數(shù)是從0開(kāi)始的,R和Matlab的使用者需要小心。
我們可以通過(guò)"type"函數(shù)查看a的類型,這里顯示a是一個(gè)array:
type(a)
numpy.ndarray
通過(guò)函數(shù)"reshape",我們可以重新構(gòu)造一下這個(gè)數(shù)組,例如,我們可以構(gòu)造一個(gè)4*5的二維數(shù)組,其中"reshape"的參數(shù)表示各維度的大小,且按各維順序排列(兩維時(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)造更高維的也沒(méi)問(wèn)題:
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ù)進(jìn)一步查看a的相關(guān)屬性:"ndim"查看維度;"shape"查看各維度的大?。?size"查看全部的元素個(gè)數(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)建可通過(guò)轉(zhuǎn)換列表實(shí)現(xiàn),高維數(shù)組可通過(guò)轉(zhuǎn)換嵌套列表實(shí)現(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.]])
默認(rèn)生成的類型是浮點(diǎn)型,可以通過(guò)指定類型改為整型:
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ū)間的隨機(jī)數(shù)數(shù)組:
np.random.rand(5)
array([0.80378557, 0.09833667, 0.95280995, 0.17707594, 0.80651926])
服從正態(tài)分布的隨機(jī)數(shù)組:
np.random.randn(5)
array([ 0.678737 , -1.14965615, -1.40492579, 1.22479651, 0.2751816 ])四、數(shù)組操作
簡(jiǎn)單的四則運(yùn)算已經(jīng)重載過(guò)了,全部的"+","-","*","/"運(yùn)算都是基于全部的數(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中雖然僅有一個(gè)與元素是浮點(diǎn)數(shù),其余均為整數(shù),在處理中Python會(huì)自動(dòng)將整數(shù)轉(zhuǎn)換為浮點(diǎn)數(shù)(因?yàn)閿?shù)組是同質(zhì)的),并且,兩個(gè)二維數(shù)組相加要求各維度大小相同。當(dāng)然,NumPy里這些運(yùn)算符也可以對(duì)標(biāo)量和數(shù)組操作,結(jié)果是數(shù)組的全部元素對(duì)應(yīng)這個(gè)標(biāo)量進(jìn)行運(yùn)算,還是一個(gè)數(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. ]])
開(kāi)根號(hào)求指數(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ù)組的最大最小值怎么辦?想計(jì)算全部元素的和、按行求和、按列求和怎么辦?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é)計(jì)算中大量使用到矩陣運(yùn)算,除了數(shù)組,NumPy同時(shí)提供了矩陣對(duì)象(matrix)。矩陣對(duì)象和數(shù)組的主要有兩點(diǎn)差別:一是矩陣是二維的,而數(shù)組的可以是任意正整數(shù)維;二是矩陣的"*"操作符進(jìn)行的是矩陣乘法,乘號(hào)左側(cè)的矩陣列和乘號(hào)右側(cè)的矩陣行要相等,而在數(shù)組中"*"操作符進(jìn)行的是每一元素的對(duì)應(yīng)相乘,乘號(hào)兩側(cè)的數(shù)組每一維大小需要一致。數(shù)組可以通過(guò)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))
再來(lái)看一下矩陣的乘法,這使用arange生成另一個(gè)矩陣b,arange函數(shù)還可以通過(guò)arange(起始,終止,步長(zhǎng))的方式調(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]]
回到我們的問(wèn)題,矩陣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ù)組元素訪問(wèn)
數(shù)組和矩陣元素的訪問(wèn)可通過(guò)下標(biāo)進(jìn)行,以下均以二維數(shù)組(或矩陣)為例:
a = np.array([[3.2, 1.5], [2.5, 4]]) print(a[0][1]) print(a[0, 1])
1.5 1.5
可以通過(guò)下標(biāo)訪問(wèn)來(lái)修改數(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)在問(wèn)題來(lái)了,明明改的是a0,怎么連b0也跟著變了?這個(gè)陷阱在Python編程中很容易碰上,其原因在于Python不是真正將a復(fù)制一份給b,而是將b指到了a對(duì)應(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. ]]
若對(duì)a重新賦值,即將a指到其他地址上,b仍在原來(lái)的地址上:
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. ]]
利用":"可以訪問(wèn)到某一維的全部數(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ù)的處理中十分常見(jiàn),通常用在單行單列上。下面這個(gè)例子是將第一列大于5的元素(10和15)對(duì)應(yīng)的第三列元素(12和17)取出來(lái):
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ù)組)作為例子,首先來(lái)看矩陣轉(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 ]]
按列拼接兩個(gè)向量成一個(gè)矩陣:
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é)果拼接成一個(gè)矩陣是十分有用的,可以通過(guò)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作為缺失值的記錄,通過(guò)isnan判定。
a = np.random.rand(2,2) a[0, 1] = np.nan print(np.isnan(a))
[[False True] [False False]]
nan_to_num可用來(lái)將nan替換成0,pandas中提供能指定nan替換值的函數(shù)。
print(np.nan_to_num(a))
[[0.04279427 0. ] [0.08386045 0.3567586 ]]參考文獻(xiàn)
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)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/45210.html
摘要:安裝安裝用于數(shù)據(jù)科學(xué)的的最佳方法是使用發(fā)行版。但這只是展示了構(gòu)建數(shù)據(jù)科學(xué)問(wèn)題的不同方式中的機(jī)器學(xué)習(xí)這是一個(gè)重要的主題,機(jī)器學(xué)習(xí)正在風(fēng)靡世界,是數(shù)據(jù)科學(xué)家工作的重要組成部分。 作為編程界的頭牌名媛,Python平易近人的態(tài)度和精明婉約的靈動(dòng)深得各個(gè)大佬歡心。比如:人工智能、web開(kāi)發(fā)、爬蟲(chóng)、系統(tǒng)運(yùn)維、數(shù)據(jù)分析與計(jì)算等等。這幾位風(fēng)流多金的行業(yè)精英隨便哪個(gè)都能逆轉(zhuǎn)未來(lái)。 本文為你精心準(zhǔn)備了一...
摘要:從本博客開(kāi)始,將系統(tǒng)的學(xué)習(xí)的數(shù)據(jù)分析的六大模塊,有關(guān)的基礎(chǔ)知識(shí),可以看我的博客。專為進(jìn)行嚴(yán)格的數(shù)字處理而產(chǎn)生。在實(shí)現(xiàn)一個(gè)程序之前,值得檢查下所需的數(shù)據(jù)處理方式是否已經(jīng)在中存在了。積分六官網(wǎng)為了解決數(shù)據(jù)分析而創(chuàng)建的庫(kù)。 從本博客開(kāi)始,將系統(tǒng)的學(xué)習(xí)Python的數(shù)據(jù)分析的六大模塊numpy、scipy、matplotlib、pandas、scikit-learn、keras,有關(guān)Pytho...
摘要:開(kāi)發(fā)指南開(kāi)發(fā)指南開(kāi)發(fā)指南如果使用進(jìn)行機(jī)器學(xué)習(xí)方面的數(shù)據(jù)分析,需要在集群上安裝一些依賴包。以版本為例,安裝方法如下是一款專為科學(xué)和工程設(shè)計(jì)的工具包。以版本為例,安裝方法如下是下,專門(mén)面向機(jī)器學(xué)習(xí)的工具包。 developer/pythondev.mdPython開(kāi)發(fā)指南如果使用pyspark進(jìn)行機(jī)器學(xué)習(xí)方面的數(shù)據(jù)分析,需要在集群上安裝一些python依賴包。這里將介紹常用的幾個(gè)依賴包的安裝方法...
摘要:在本節(jié)中,我們將看到一些最流行和最常用的庫(kù),用于機(jī)器學(xué)習(xí)和深度學(xué)習(xí)是用于數(shù)據(jù)挖掘,分析和機(jī)器學(xué)習(xí)的最流行的庫(kù)。愿碼提示網(wǎng)址是一個(gè)基于的框架,用于使用多個(gè)或進(jìn)行有效的機(jī)器學(xué)習(xí)和深度學(xué)習(xí)。 showImg(https://segmentfault.com/img/remote/1460000018961827?w=999&h=562); 來(lái)源 | 愿碼(ChainDesk.CN)內(nèi)容編輯...
摘要:學(xué)習(xí)利器我的小白安裝之路序易用,但用好卻不易,其中比較頭疼的就是包管理和不同版本的問(wèn)題,特別是當(dāng)你使用的時(shí)候。另外值得一提的是,并不僅僅管理的工具包,它也能安裝非的包。 Python學(xué)習(xí)利器——我的小白 Anaconda安裝之路 序 Python易用,但用好卻不易,其中比較頭疼的就是包管理和Python不同版本的問(wèn)題,特別是當(dāng)你使用Windows的時(shí)候。為了解決這些問(wèn)題,有不少發(fā)行版的...
閱讀 3681·2021-10-09 09:41
閱讀 2833·2021-10-08 10:18
閱讀 2284·2021-09-10 10:51
閱讀 2768·2021-09-10 10:50
閱讀 957·2021-09-09 09:33
閱讀 3503·2021-09-06 15:14
閱讀 3166·2019-08-30 11:06
閱讀 3361·2019-08-29 14:04