摘要:是什么今天開始會陸續為大家帶來數據科學常用包的基礎用法數據分析的工作涉及到大量的數值運算,一個高效方便的科學計算工具是必不可少的。
NumPy是什么?
今天開始會陸續為大家帶來數據科學常用包的基礎用法
數據分析的工作涉及到大量的數值運算,一個高效方便的科學計算工具是必不可少的。Python語言一開始并不是設計為科學計算使用的語言,隨著越來越多的人發現Python的易用性,逐漸出現了關于Python的大量外部擴展,Numpy (Numeric Python)就是其中之一。
Numpy提供了大量的數值編程工具,可以方便地處理向量、矩陣等運算,極大地便利了人們在科學計算方面的工作。另一方面,Python是免費,相比于花費高額的費用使用Matlab,Numpy的出現使Python得到了更多人的青睞。
我們可以簡單看一下如何開始使用NumPy:
import numpy as np numpy.version.full_version
"1.16.4"二、NumPy對象:數組
NumPy中的基本對象是同類型的多維數組(homogeneous multidimensional array),這和C++中的數組是一致的,例如字符型和數值型就不可共存于同一個數組中。先上例子:
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]
這里我們生成了一個一維數組a,從0開始,步長為1,長度為20。Python中的計數是從0開始的,R和Matlab的使用者需要小心。
我們可以通過"type"函數查看a的類型,這里顯示a是一個array:
type(a)
numpy.ndarray
通過函數"reshape",我們可以重新構造一下這個數組,例如,我們可以構造一個4*5的二維數組,其中"reshape"的參數表示各維度的大小,且按各維順序排列(兩維時就是按行排列,這和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]]
構造更高維的也沒問題:
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,我們還可以調用array的函數進一步查看a的相關屬性:"ndim"查看維度;"shape"查看各維度的大小;"size"查看全部的元素個數,等于各維度大小的乘積;"dtype"可查看元素類型;"dsize"查看元素占位(bytes)大小。
a.ndim
3
a.shape
(2, 2, 5)
a.size
20
a.dtype
dtype("int32")三、創建數組
數組的創建可通過轉換列表實現,高維數組可通過轉換嵌套列表實現:
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]])
一些特殊的數組有特別定制的命令生成,如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)區間的隨機數數組:
np.random.rand(5)
array([0.80378557, 0.09833667, 0.95280995, 0.17707594, 0.80651926])
服從正態分布的隨機數組:
np.random.randn(5)
array([ 0.678737 , -1.14965615, -1.40492579, 1.22479651, 0.2751816 ])四、數組操作
簡單的四則運算已經重載過了,全部的"+","-","*","/"運算都是基于全部的數組元素的,以加法為例:
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. ]]
這里可以發現,a中雖然僅有一個與元素是浮點數,其余均為整數,在處理中Python會自動將整數轉換為浮點數(因為數組是同質的),并且,兩個二維數組相加要求各維度大小相同。當然,NumPy里這些運算符也可以對標量和數組操作,結果是數組的全部元素對應這個標量進行運算,還是一個數組:
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. ]])
開根號求指數也很容易:
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. ]]
需要知道二維數組的最大最小值怎么辦?想計算全部元素的和、按行求和、按列求和怎么辦?NumPy的ndarray類已經做好函數了:
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]
科學計算中大量使用到矩陣運算,除了數組,NumPy同時提供了矩陣對象(matrix)。矩陣對象和數組的主要有兩點差別:一是矩陣是二維的,而數組的可以是任意正整數維;二是矩陣的"*"操作符進行的是矩陣乘法,乘號左側的矩陣列和乘號右側的矩陣行要相等,而在數組中"*"操作符進行的是每一元素的對應相乘,乘號兩側的數組每一維大小需要一致。數組可以通過asmatrix或者mat轉換為矩陣,或者直接生成也可以:
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函數還可以通過arange(起始,終止,步長)的方式調用生成等差數列,注意含頭不含尾。
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]]五、數組元素訪問
數組和矩陣元素的訪問可通過下標進行,以下均以二維數組(或矩陣)為例:
a = np.array([[3.2, 1.5], [2.5, 4]]) print(a[0][1]) print(a[0, 1])
1.5 1.5
可以通過下標訪問來修改數組元素的值:
b = a a[0][1] = 2.0 print(a) print(b)
[[3.2 2. ] [2.5 4. ]] [[3.2 2. ] [2.5 4. ]]
現在問題來了,明明改的是a0,怎么連b0也跟著變了?這個陷阱在Python編程中很容易碰上,其原因在于Python不是真正將a復制一份給b,而是將b指到了a對應數據的內存地址上。想要真正的復制一份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. ]]
利用":"可以訪問到某一維的全部數據,例如取矩陣中的指定列:
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]]
稍微復雜一些,我們嘗試取出滿足某些條件的元素,這在數據的處理中十分常見,通常用在單行單列上。下面這個例子是將第一列大于5的元素(10和15)對應的第三列元素(12和17)取出來:
a[:, 2][a[:, 0] > 5]
array([12, 17])
可使用where函數查找特定值在數組中的位置:
loc = numpy.where(a==11) print(loc) print(a[loc[0][0], loc[1][0]])
(array([2], dtype=int64), array([1], dtype=int64)) 11六、數組操作
還是拿矩陣(或二維數組)作為例子,首先來看矩陣轉置:
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]]
在循環處理某些數據得到結果后,將結果拼接成一個矩陣是十分有用的,可以通過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替換值的函數。
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.
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/45210.html
摘要:安裝安裝用于數據科學的的最佳方法是使用發行版。但這只是展示了構建數據科學問題的不同方式中的機器學習這是一個重要的主題,機器學習正在風靡世界,是數據科學家工作的重要組成部分。 作為編程界的頭牌名媛,Python平易近人的態度和精明婉約的靈動深得各個大佬歡心。比如:人工智能、web開發、爬蟲、系統運維、數據分析與計算等等。這幾位風流多金的行業精英隨便哪個都能逆轉未來。 本文為你精心準備了一...
摘要:從本博客開始,將系統的學習的數據分析的六大模塊,有關的基礎知識,可以看我的博客。專為進行嚴格的數字處理而產生。在實現一個程序之前,值得檢查下所需的數據處理方式是否已經在中存在了。積分六官網為了解決數據分析而創建的庫。 從本博客開始,將系統的學習Python的數據分析的六大模塊numpy、scipy、matplotlib、pandas、scikit-learn、keras,有關Pytho...
摘要:開發指南開發指南開發指南如果使用進行機器學習方面的數據分析,需要在集群上安裝一些依賴包。以版本為例,安裝方法如下是一款專為科學和工程設計的工具包。以版本為例,安裝方法如下是下,專門面向機器學習的工具包。 developer/pythondev.mdPython開發指南如果使用pyspark進行機器學習方面的數據分析,需要在集群上安裝一些python依賴包。這里將介紹常用的幾個依賴包的安裝方法...
摘要:在本節中,我們將看到一些最流行和最常用的庫,用于機器學習和深度學習是用于數據挖掘,分析和機器學習的最流行的庫。愿碼提示網址是一個基于的框架,用于使用多個或進行有效的機器學習和深度學習。 showImg(https://segmentfault.com/img/remote/1460000018961827?w=999&h=562); 來源 | 愿碼(ChainDesk.CN)內容編輯...
摘要:學習利器我的小白安裝之路序易用,但用好卻不易,其中比較頭疼的就是包管理和不同版本的問題,特別是當你使用的時候。另外值得一提的是,并不僅僅管理的工具包,它也能安裝非的包。 Python學習利器——我的小白 Anaconda安裝之路 序 Python易用,但用好卻不易,其中比較頭疼的就是包管理和Python不同版本的問題,特別是當你使用Windows的時候。為了解決這些問題,有不少發行版的...
閱讀 3527·2021-10-09 09:41
閱讀 2733·2021-10-08 10:18
閱讀 2164·2021-09-10 10:51
閱讀 2668·2021-09-10 10:50
閱讀 763·2021-09-09 09:33
閱讀 3369·2021-09-06 15:14
閱讀 3002·2019-08-30 11:06
閱讀 3230·2019-08-29 14:04