亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

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

Dean / 2766人閱讀

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

相關(guān)文章

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

    摘要:安裝安裝用于數(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)備了一...

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

    摘要:從本博客開(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...

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

    摘要:開(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è)依賴包的安裝方法...

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

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

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

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

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

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<