成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Python 數(shù)據(jù)科學(xué)常用包 (一) Numpy

Dean / 2704人閱讀

摘要:是什么今天開始會陸續(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

相關(guān)文章

  • 編程界的“頭牌”名媛:Python,14個與數(shù)據(jù)科學(xué)的“曖昧情事”

    摘要:安裝安裝用于數(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)未來。 本文為你精心準備了一...

    Labradors 評論0 收藏0
  • Python數(shù)據(jù)分析

    摘要:從本博客開始,將系統(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...

    Shimmer 評論0 收藏0
  • Python開發(fā)指南 托管Hadoop集群 UHadoop

    摘要:開發(fā)指南開發(fā)指南開發(fā)指南如果使用進行機器學(xué)習(xí)方面的數(shù)據(jù)分析,需要在集群上安裝一些依賴包。以版本為例,安裝方法如下是一款專為科學(xué)和工程設(shè)計的工具包。以版本為例,安裝方法如下是下,專門面向機器學(xué)習(xí)的工具包。 developer/pythondev.mdPython開發(fā)指南如果使用pyspark進行機器學(xué)習(xí)方面的數(shù)據(jù)分析,需要在集群上安裝一些python依賴包。這里將介紹常用的幾個依賴包的安裝方法...

    ernest.wang 評論0 收藏2969
  • 15個Python庫,讓你學(xué)習(xí)數(shù)據(jù)科學(xué)更輕松

    摘要:在本節(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)容編輯...

    W4n9Hu1 評論0 收藏0
  • Python學(xué)習(xí)利器——我的小白 Anaconda安裝之路

    摘要:學(xué)習(xí)利器我的小白安裝之路序易用,但用好卻不易,其中比較頭疼的就是包管理和不同版本的問題,特別是當(dāng)你使用的時候。另外值得一提的是,并不僅僅管理的工具包,它也能安裝非的包。 Python學(xué)習(xí)利器——我的小白 Anaconda安裝之路 序 Python易用,但用好卻不易,其中比較頭疼的就是包管理和Python不同版本的問題,特別是當(dāng)你使用Windows的時候。為了解決這些問題,有不少發(fā)行版的...

    余學(xué)文 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<