摘要:現(xiàn)在到數(shù)據(jù)分析部分,先從開始環(huán)境基礎(chǔ)是高性能科學(xué)計(jì)算和數(shù)據(jù)分析的基礎(chǔ)包?;ㄊ剿饕ㄊ剿饕傅氖抢谜蛿?shù)組進(jìn)行索引,它是將索引數(shù)組的元素的值作為目標(biāo)數(shù)組的下標(biāo),來獲取目標(biāo)數(shù)組下標(biāo)對(duì)應(yīng)的值。
最近的爬蟲學(xué)習(xí)告一段落,后續(xù)補(bǔ)上爬蟲的筆記。現(xiàn)在到數(shù)據(jù)分析部分,先從NumPy開始(環(huán)境python-3.6.5) 2019/1/23NumPy基礎(chǔ)
NumPy是高性能科學(xué)計(jì)算和數(shù)據(jù)分析的基礎(chǔ)包。包括以下幾個(gè)功能:
ndarray,一個(gè)具有矢量算術(shù)運(yùn)算和復(fù)雜廣播能力的快速且節(jié)省空間的多維數(shù)組;
用于對(duì)整組數(shù)據(jù)進(jìn)行快速運(yùn)算的標(biāo)準(zhǔn)數(shù)學(xué)函數(shù)(無需編寫循環(huán));
用于讀寫磁盤的工具以及用于操作內(nèi)存映射文件的工具;
線性代數(shù),隨機(jī)數(shù)生成以及傅里葉變換功能;
用于集成由C,C++,F(xiàn)ortran等語言編寫的代碼的工具。
例子引入用python原生代碼對(duì)兩個(gè)向量相加
def pythonsum(n): a = list(range(n)) b = list(range(n)) c = [] for i in range(len(a)): a[i] = i ** 2 b[i] = i ** 3 c.append(a[i] + b[i]) return c arr = pythonsum(2) print(arr)
利用NumPy對(duì)向量相加。
import numpy as np def numpysum(n): a = np.arange(n) ** 2 b = np.arange(n) ** 3 c = a + b return c arr = numpysum(2) print(arr)
兩種方法都可以對(duì)向量進(jìn)行相加,相比而言利用NumPy庫的代碼會(huì)更簡(jiǎn)潔一點(diǎn)。可以對(duì)兩種方法計(jì)算出執(zhí)行時(shí)間,結(jié)果也是NumPy的效率高些。
ndarray,多維數(shù)組對(duì)象NumPy中的ndarray是一個(gè)多維數(shù)組對(duì)象,這個(gè)對(duì)象是一個(gè)快速而且靈活的大數(shù)據(jù)集容器,該對(duì)象由兩個(gè)部分組成:
實(shí)際的數(shù)據(jù)
描述這些數(shù)據(jù)的元數(shù)據(jù)
ndarray是一個(gè)通用的同構(gòu)數(shù)據(jù)多維容器,指的是其中的元素必須是相同的數(shù)據(jù)類型,每一個(gè)數(shù)組都有一個(gè)shape(表示各維度大小的元組)和一個(gè)dtype(用于說明數(shù)據(jù)類型的對(duì)象)。
In [12]: import numpy as np In [13]: a = np.arange(5) In [14]: a.dtype Out[14]: dtype("int32") In [15]: a.shape Out[15]: (5,) In [16]: a Out[16]: array([0, 1, 2, 3, 4])
NumPy中創(chuàng)建數(shù)組的函數(shù)
函數(shù) | 說明 | |
---|---|---|
array | 將輸入數(shù)據(jù)(元組,列表或其他序列類型)轉(zhuǎn)換為ndarray。要么推斷出dtype,要么顯示指定dtype。默認(rèn)直接復(fù)制輸入數(shù)據(jù) | |
asarray | 將輸入轉(zhuǎn)換為ndarray,如果輸入就是一個(gè)ndarray就不進(jìn)行復(fù)制 | |
arange | 類似內(nèi)置的range,但返回的是一個(gè)ndarray而不是一個(gè)列表 | |
ones,ones_like | 根據(jù)指定的形狀和dtype創(chuàng)建一個(gè)全是1的數(shù)組。ones_like以另一個(gè)數(shù)組為參數(shù),并根據(jù)其形狀和dtype創(chuàng)建一個(gè)全為1的數(shù)組 | |
zeros,zeros_like | 類似于ones,ones_like,只不過創(chuàng)建的是全為0的數(shù)組 |
示例1:創(chuàng)建一維數(shù)組
In [12]: import numpy as np In [29]: data = [1,2,3,4] In [30]: arr = np.array(data) In [31]: arr Out[31]: array([1, 2, 3, 4])
示例2:創(chuàng)建多維數(shù)組
In [32]: data2 = [[1,2,3,4],[5,6,7,8]] In [33]: arr2 = np.array(data2) In [34]: arr2 Out[34]: array([[1, 2, 3, 4], [5, 6, 7, 8]]) In [35]: arr2.dtype Out[35]: dtype("int32") In [36]: arr2.shape Out[36]: (2, 4)
示例3:使用zeros()函數(shù)創(chuàng)建元素全為0的數(shù)組
In [37]: np.zeros(5) Out[37]: array([0., 0., 0., 0., 0.]) In [38]: np.zeros((2,4)) Out[38]: array([[0., 0., 0., 0.], [0., 0., 0., 0.]]) In [39]: np.zeros((4,2)) Out[39]: array([[0., 0.], [0., 0.], [0., 0.], [0., 0.]])
示例4:使用empty()函數(shù)
In [44]: np.empty((2,4)) Out[44]: array([[0., 0., 0., 0.], [0., 0., 0., 0.]]) #empty函數(shù)大多數(shù)情況是返回一些未初始化的垃圾值
示例5:arange()函數(shù)
In [51]: np.arange(10) Out[51]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])NumPy數(shù)據(jù)類型
示例
In [4]: print(np.float64(42)) 42.0 In [5]: print(np.int8(42.0)) 42 In [6]: print(np.bool(42)) True In [7]: print(np.bool(0)) False
定義數(shù)組的數(shù)據(jù)類型
創(chuàng)建數(shù)組的時(shí)候如果沒有指定dtype的話,那么它會(huì)自動(dòng)推斷出數(shù)組元素的數(shù)據(jù)類型。如果指定了dtype,那么定義的數(shù)據(jù)類型是什么,數(shù)組元素的數(shù)據(jù)類型就是什么。
In [10]: print(np.arange(7,dtype=np.float64)) [0. 1. 2. 3. 4. 5. 6.] In [11]: print(np.arange(7,dtype=np.complex64)) [0.+0.j 1.+0.j 2.+0.j 3.+0.j 4.+0.j 5.+0.j 6.+0.j]
數(shù)據(jù)類型的轉(zhuǎn)換
數(shù)組的數(shù)據(jù)類型轉(zhuǎn)換可以使用ndarray的astype方法顯示地轉(zhuǎn)換dtype。
In [12]: arr = np.array([1,2,3])#整型 In [13]: arr.dtype Out[13]: dtype("int32") In [14]: float_arr = arr.astype(np.float64)#整型轉(zhuǎn)換為浮點(diǎn)型 In [15]: float_arr Out[15]: array([1., 2., 3.]) In [16]: float_arr.dtype Out[16]: dtype("float64")
用簡(jiǎn)潔的類型代碼定義dtype
In [27]: print(np.arange(7,dtype="f")) [0. 1. 2. 3. 4. 5. 6.] In [28]: print(np.arange(7,dtype="D")) [0.+0.j 1.+0.j 2.+0.j 3.+0.j 4.+0.j 5.+0.j 6.+0.j] #查看代碼表示的數(shù)據(jù)類型 In [29]: print(np.dtype("f")) float32 In [30]: print(np.dtype("F")) complex64 In [31]: print(np.dtype("d")) float64 In [36]: print(np.dtype("U"))自定義數(shù)據(jù)類型
需求:假如需要有一個(gè)存儲(chǔ)商店庫存信息的數(shù)據(jù)類型,格式是有一個(gè)長(zhǎng)度為40字節(jié)的字符串來記錄商品的名稱,32位的整數(shù)來記錄商品的庫存數(shù)量,32位的單精度浮點(diǎn)數(shù)來記錄商品的價(jià)格。
可以這樣定義數(shù)據(jù)類型In [39]: t = np.dtype([("name",np.str_,40),("num",np.int32),("price",np.float32)]) In [40]: t Out[40]: dtype([("name", "數(shù)組與標(biāo)量之間的運(yùn)算 數(shù)組不用編寫循環(huán)就可以對(duì)數(shù)據(jù)進(jìn)行批量運(yùn)算。
In [45]: arr = np.array([[1., 2., 3.], [4., 5., 6.]]) In [46]: arr Out[46]: array([[1., 2., 3.], [4., 5., 6.]]) In [47]: arr * arr Out[47]: array([[ 1., 4., 9.], [16., 25., 36.]]) In [48]: arr - arr Out[48]: array([[0., 0., 0.], [0., 0., 0.]]) In [49]: arr + arr Out[49]: array([[ 2., 4., 6.], [ 8., 10., 12.]])大小相同的數(shù)組之間進(jìn)行算術(shù)運(yùn)算都會(huì)作用到每個(gè)元素上
In [50]: arr = np.array([[1,2],[3,4]]) In [51]: arr Out[51]: array([[1, 2], [3, 4]]) In [52]: arr * 2 Out[52]: array([[2, 4], [6, 8]]) In [53]: arr + 2 Out[53]: array([[3, 4], [5, 6]]) In [54]: arr - 1 Out[54]: array([[0, 1], [2, 3]])注:除了數(shù)組和標(biāo)量之間的運(yùn)算以及相同大小數(shù)組之間的運(yùn)算之外,不同大小的數(shù)組之間也可以進(jìn)行運(yùn)算,叫做廣播。(關(guān)于廣播后續(xù)再談...)
數(shù)組的索引和切片一維數(shù)組的索引和切片(與python的列表非常相似)
In [57]: a = np.arange(9) In [58]: a Out[58]: array([0, 1, 2, 3, 4, 5, 6, 7, 8]) In [59]: a[3] Out[59]: 3 In [60]: a[3:5] Out[60]: array([3, 4]) In [61]: a[:7:2] Out[61]: array([0, 2, 4, 6]) In [62]: a[::-1] Out[62]: array([8, 7, 6, 5, 4, 3, 2, 1, 0]) In [63]: a[3:7] = 666 In [64]: a Out[64]: array([ 0, 1, 2, 666, 666, 666, 666, 7, 8])多維數(shù)組的索引和切片
In [14]: arr = np.arange(24).reshape(2,3,4) In [15]: arr Out[15]: array([[[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]], [[12, 13, 14, 15], [16, 17, 18, 19], [20, 21, 22, 23]]]) #選取第一個(gè)元素 In [16]: arr[0,0,0] Out[16]: 0 #第一個(gè)維度不要,選取第一行第一列的元素 In [17]: arr[:,0,0] Out[17]: array([ 0, 12]) #第一個(gè)維度的下標(biāo)0代表的元素,后面的維度都不選取的話可以加省略號(hào),也可以寫arr[0,:,:]效果是一樣的。 In [18]: arr[0, ...] Out[18]: array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]]) #第一個(gè)維度的下標(biāo)0代表的元素 In [19]: arr[0] Out[19]: array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]]) In [20]: arr[0,1] Out[20]: array([4, 5, 6, 7]) In [21]: arr[0,1,::2] Out[21]: array([4, 6]) In [22]: arr[...,1] Out[22]: array([[ 1, 5, 9], [13, 17, 21]]) In [23]: arr[:,1] Out[23]: array([[ 4, 5, 6, 7], [16, 17, 18, 19]]) In [24]: arr[0,:,-1] Out[24]: array([ 3, 7, 11]) In [25]: arr[0,::-1,-1] Out[25]: array([11, 7, 3])布爾型索引
布爾型索引指可以利用一個(gè)布爾型數(shù)組來對(duì)目標(biāo)數(shù)組進(jìn)行索引,找到布爾數(shù)組中值為True對(duì)應(yīng)的目標(biāo)數(shù)組的值。而需要注意的一點(diǎn)是布爾數(shù)組的長(zhǎng)度必須和目標(biāo)數(shù)組的軸長(zhǎng)度一致。下面舉例說明一維數(shù)組的布爾型索引
創(chuàng)建一個(gè)布爾型數(shù)組和一個(gè)目標(biāo)數(shù)組。In [27]: bool_arr = np.array([True,False,False,True,False]) In [29]: dest_arr = np.arange(5) In [30]: dest_arr Out[30]: array([0, 1, 2, 3, 4]) In [31]: bool_arr Out[31]: array([ True, False, False, True, False]) #布爾型數(shù)組會(huì)匹配True中對(duì)應(yīng)的目標(biāo)數(shù)組的值 In [32]: dest_arr[bool_arr] Out[32]: array([0, 3]) #可以對(duì)這些值進(jìn)行算術(shù)操作,比如將匹配的數(shù)據(jù)都賦值為-5 In [35]: dest_arr[bool_arr] = -5 In [36]: dest_arr Out[36]: array([-5, 1, 2, -5, 4])多維數(shù)組的布爾型索引
數(shù)組的比較運(yùn)是矢量化的,將names數(shù)組和字符串"Bob"比較會(huì)產(chǎn)生一個(gè)布爾型數(shù)組In [2]: names = np.array(["Bob","Joe","will","Bob","Joe","Joe"]) In [3]: arr = np.arange(24).reshape((6,4)) In [4]: arr Out[4]: array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11], [12, 13, 14, 15], [16, 17, 18, 19], [20, 21, 22, 23]]) In [5]: names Out[5]: array(["Bob", "Joe", "will", "Bob", "Joe", "Joe"], dtype="布爾索引實(shí)現(xiàn)的是通過列向量中的每個(gè)元素的布爾量數(shù)值對(duì)一個(gè)與列向量有著同樣行數(shù)的矩陣進(jìn)行符合匹配。而這樣的作用,其實(shí)是把列向量中布爾量為True的相應(yīng)行向量給抽取了出來。如果進(jìn)行變量或者標(biāo)定量的大數(shù)據(jù)處理,這種篩選功能的使用肯定會(huì)給程序的設(shè)計(jì)帶來極大的便捷。
花式索引
花式索引指的是利用整型數(shù)組進(jìn)行索引,它是將索引數(shù)組的元素的值作為目標(biāo)數(shù)組的下標(biāo),來獲取目標(biāo)數(shù)組下標(biāo)對(duì)應(yīng)的值。它是將數(shù)據(jù)復(fù)制到新的數(shù)組當(dāng)中。In [17]: arr = np.empty((8,4)) In [18]: for i in range(8): ...: arr[i] = i ...: In [19]: arr Out[19]: array([[0., 0., 0., 0.], [1., 1., 1., 1.], [2., 2., 2., 2.], [3., 3., 3., 3.], [4., 4., 4., 4.], [5., 5., 5., 5.], [6., 6., 6., 6.], [7., 7., 7., 7.]]) #這里的[4,3,0,6]就是索引數(shù)組,同時(shí)4,3,0,6是arr數(shù)組的下標(biāo)值, #取出的數(shù)據(jù)就是array[arr[4],arr[3],arr[0],arr[6]] In [20]: arr[[4,3,0,6]] Out[20]: array([[4., 4., 4., 4.], [3., 3., 3., 3.], [0., 0., 0., 0.], [6., 6., 6., 6.]]) In [21]: arr[[-1,-2,-3]] Out[21]: array([[7., 7., 7., 7.], [6., 6., 6., 6.], [5., 5., 5., 5.]])參考鏈接:
布爾型索引和花式索引: https://www.jianshu.com/p/743...
<<利用python進(jìn)行數(shù)據(jù)分析>>:https://github.com/BrambleXu/...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/43070.html
摘要:下文統(tǒng)一稱為數(shù)組是存儲(chǔ)單一數(shù)據(jù)類型的多維數(shù)組同語言數(shù)組直接保存數(shù)值而則是能夠?qū)?shù)組進(jìn)行處理的函數(shù)。動(dòng)態(tài)數(shù)據(jù)類型與的數(shù)組和的這些不可變數(shù)據(jù)類型的適用場(chǎng)景等可變數(shù)據(jù)類型適用于需要不斷對(duì)原始數(shù)據(jù)進(jìn)行修改的場(chǎng)景。 showImg(https://segmentfault.com/img/remote/1460000018925396);Numpy,是python中的一個(gè)矩陣計(jì)算包,功能類似ma...
摘要:提供了使我們能夠快速便捷地處理結(jié)構(gòu)化數(shù)據(jù)的大量數(shù)據(jù)結(jié)構(gòu)和函數(shù)。結(jié)構(gòu)化數(shù)據(jù),例如多維數(shù)據(jù)矩陣表格行數(shù)據(jù),其中各列可能是不同的類型字符串?dāng)?shù)值日期等?;A(chǔ)數(shù)組和矢量計(jì)算高性能科學(xué)計(jì)算和數(shù)據(jù)分析的基礎(chǔ)包。 本篇內(nèi)容為整理《利用Python進(jìn)行數(shù)據(jù)分析》,博主使用代碼為 Python3,部分內(nèi)容和書本有出入。 利用 Python 進(jìn)行科學(xué)計(jì)算的實(shí)用指南。本書重點(diǎn)介紹了用于高效解決各種數(shù)據(jù)分析問...
摘要:從本博客開始,將系統(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)建的庫。 從本博客開始,將系統(tǒng)的學(xué)習(xí)Python的數(shù)據(jù)分析的六大模塊numpy、scipy、matplotlib、pandas、scikit-learn、keras,有關(guān)Pytho...
摘要:包的核心是對(duì)象。但有個(gè)例外,包括對(duì)象數(shù)組的元素大小是不同的。序列大小和速度在科學(xué)計(jì)算中尤為重要。例如考慮兩個(gè)長(zhǎng)度相同的列表中每個(gè)元素相乘的情況。此外,編碼所需的工作量隨數(shù)據(jù)維數(shù)的增加而增加。這些信息主要用于高級(jí)用戶。 譯者:飛龍 1.1 NumPy 是什么? 原文:What is NumPy? NumPy是Python中用于科學(xué)計(jì)算的基礎(chǔ)包。它是一個(gè)Python庫,提供多維數(shù)組對(duì)象,各...
摘要:屬于前一種,而且日益被用于數(shù)學(xué)計(jì)算機(jī)器學(xué)習(xí)和多種數(shù)據(jù)科學(xué)應(yīng)用。近來,由于擁有多個(gè)針對(duì)機(jī)器學(xué)習(xí)自然語言處理數(shù)據(jù)視覺化數(shù)據(jù)探索數(shù)據(jù)分析和數(shù)據(jù)挖掘的插件,豐富的數(shù)據(jù)科學(xué)生態(tài)體系得到了較大的發(fā)展,甚至有將數(shù)據(jù)科學(xué)社區(qū)化的趨勢(shì)。 譯者注:本文的英文原文地址是:Python for Data Science vs Python for Web Development,發(fā)布時(shí)間是10月29日。譯者一...
閱讀 1996·2021-09-04 16:45
閱讀 792·2019-08-30 15:44
閱讀 922·2019-08-30 13:07
閱讀 486·2019-08-29 16:06
閱讀 1407·2019-08-29 13:43
閱讀 1319·2019-08-26 17:00
閱讀 1549·2019-08-26 13:51
閱讀 2324·2019-08-26 11:48