摘要:現在到數據分析部分,先從開始環境基礎是高性能科學計算和數據分析的基礎包。花式索引花式索引指的是利用整型數組進行索引,它是將索引數組的元素的值作為目標數組的下標,來獲取目標數組下標對應的值。
最近的爬蟲學習告一段落,后續補上爬蟲的筆記?,F在到數據分析部分,先從NumPy開始(環境python-3.6.5) 2019/1/23NumPy基礎
NumPy是高性能科學計算和數據分析的基礎包。包括以下幾個功能:
ndarray,一個具有矢量算術運算和復雜廣播能力的快速且節省空間的多維數組;
用于對整組數據進行快速運算的標準數學函數(無需編寫循環);
用于讀寫磁盤的工具以及用于操作內存映射文件的工具;
線性代數,隨機數生成以及傅里葉變換功能;
用于集成由C,C++,Fortran等語言編寫的代碼的工具。
例子引入用python原生代碼對兩個向量相加
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對向量相加。
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)
兩種方法都可以對向量進行相加,相比而言利用NumPy庫的代碼會更簡潔一點??梢詫煞N方法計算出執行時間,結果也是NumPy的效率高些。
ndarray,多維數組對象NumPy中的ndarray是一個多維數組對象,這個對象是一個快速而且靈活的大數據集容器,該對象由兩個部分組成:
實際的數據
描述這些數據的元數據
ndarray是一個通用的同構數據多維容器,指的是其中的元素必須是相同的數據類型,每一個數組都有一個shape(表示各維度大小的元組)和一個dtype(用于說明數據類型的對象)。
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中創建數組的函數
函數 | 說明 | |
---|---|---|
array | 將輸入數據(元組,列表或其他序列類型)轉換為ndarray。要么推斷出dtype,要么顯示指定dtype。默認直接復制輸入數據 | |
asarray | 將輸入轉換為ndarray,如果輸入就是一個ndarray就不進行復制 | |
arange | 類似內置的range,但返回的是一個ndarray而不是一個列表 | |
ones,ones_like | 根據指定的形狀和dtype創建一個全是1的數組。ones_like以另一個數組為參數,并根據其形狀和dtype創建一個全為1的數組 | |
zeros,zeros_like | 類似于ones,ones_like,只不過創建的是全為0的數組 |
示例1:創建一維數組
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:創建多維數組
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()函數創建元素全為0的數組
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()函數
In [44]: np.empty((2,4)) Out[44]: array([[0., 0., 0., 0.], [0., 0., 0., 0.]]) #empty函數大多數情況是返回一些未初始化的垃圾值
示例5:arange()函數
In [51]: np.arange(10) Out[51]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])NumPy數據類型
示例
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
定義數組的數據類型
創建數組的時候如果沒有指定dtype的話,那么它會自動推斷出數組元素的數據類型。如果指定了dtype,那么定義的數據類型是什么,數組元素的數據類型就是什么。
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]
數據類型的轉換
數組的數據類型轉換可以使用ndarray的astype方法顯示地轉換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)#整型轉換為浮點型 In [15]: float_arr Out[15]: array([1., 2., 3.]) In [16]: float_arr.dtype Out[16]: dtype("float64")
用簡潔的類型代碼定義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] #查看代碼表示的數據類型 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"))自定義數據類型
需求:假如需要有一個存儲商店庫存信息的數據類型,格式是有一個長度為40字節的字符串來記錄商品的名稱,32位的整數來記錄商品的庫存數量,32位的單精度浮點數來記錄商品的價格。
可以這樣定義數據類型In [39]: t = np.dtype([("name",np.str_,40),("num",np.int32),("price",np.float32)]) In [40]: t Out[40]: dtype([("name", "數組與標量之間的運算 數組不用編寫循環就可以對數據進行批量運算。
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.]])大小相同的數組之間進行算術運算都會作用到每個元素上
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]])注:除了數組和標量之間的運算以及相同大小數組之間的運算之外,不同大小的數組之間也可以進行運算,叫做廣播。(關于廣播后續再談...)
數組的索引和切片一維數組的索引和切片(與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])多維數組的索引和切片
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]]]) #選取第一個元素 In [16]: arr[0,0,0] Out[16]: 0 #第一個維度不要,選取第一行第一列的元素 In [17]: arr[:,0,0] Out[17]: array([ 0, 12]) #第一個維度的下標0代表的元素,后面的維度都不選取的話可以加省略號,也可以寫arr[0,:,:]效果是一樣的。 In [18]: arr[0, ...] Out[18]: array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]]) #第一個維度的下標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])布爾型索引
布爾型索引指可以利用一個布爾型數組來對目標數組進行索引,找到布爾數組中值為True對應的目標數組的值。而需要注意的一點是布爾數組的長度必須和目標數組的軸長度一致。下面舉例說明一維數組的布爾型索引
創建一個布爾型數組和一個目標數組。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]) #布爾型數組會匹配True中對應的目標數組的值 In [32]: dest_arr[bool_arr] Out[32]: array([0, 3]) #可以對這些值進行算術操作,比如將匹配的數據都賦值為-5 In [35]: dest_arr[bool_arr] = -5 In [36]: dest_arr Out[36]: array([-5, 1, 2, -5, 4])多維數組的布爾型索引
數組的比較運是矢量化的,將names數組和字符串"Bob"比較會產生一個布爾型數組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="布爾索引實現的是通過列向量中的每個元素的布爾量數值對一個與列向量有著同樣行數的矩陣進行符合匹配。而這樣的作用,其實是把列向量中布爾量為True的相應行向量給抽取了出來。如果進行變量或者標定量的大數據處理,這種篩選功能的使用肯定會給程序的設計帶來極大的便捷。
花式索引
花式索引指的是利用整型數組進行索引,它是將索引數組的元素的值作為目標數組的下標,來獲取目標數組下標對應的值。它是將數據復制到新的數組當中。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]就是索引數組,同時4,3,0,6是arr數組的下標值, #取出的數據就是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進行數據分析>>:https://github.com/BrambleXu/...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/43070.html
摘要:下文統一稱為數組是存儲單一數據類型的多維數組同語言數組直接保存數值而則是能夠對數組進行處理的函數。動態數據類型與的數組和的這些不可變數據類型的適用場景等可變數據類型適用于需要不斷對原始數據進行修改的場景。 showImg(https://segmentfault.com/img/remote/1460000018925396);Numpy,是python中的一個矩陣計算包,功能類似ma...
摘要:提供了使我們能夠快速便捷地處理結構化數據的大量數據結構和函數。結構化數據,例如多維數據矩陣表格行數據,其中各列可能是不同的類型字符串數值日期等。基礎數組和矢量計算高性能科學計算和數據分析的基礎包。 本篇內容為整理《利用Python進行數據分析》,博主使用代碼為 Python3,部分內容和書本有出入。 利用 Python 進行科學計算的實用指南。本書重點介紹了用于高效解決各種數據分析問...
摘要:從本博客開始,將系統的學習的數據分析的六大模塊,有關的基礎知識,可以看我的博客。專為進行嚴格的數字處理而產生。在實現一個程序之前,值得檢查下所需的數據處理方式是否已經在中存在了。積分六官網為了解決數據分析而創建的庫。 從本博客開始,將系統的學習Python的數據分析的六大模塊numpy、scipy、matplotlib、pandas、scikit-learn、keras,有關Pytho...
摘要:包的核心是對象。但有個例外,包括對象數組的元素大小是不同的。序列大小和速度在科學計算中尤為重要。例如考慮兩個長度相同的列表中每個元素相乘的情況。此外,編碼所需的工作量隨數據維數的增加而增加。這些信息主要用于高級用戶。 譯者:飛龍 1.1 NumPy 是什么? 原文:What is NumPy? NumPy是Python中用于科學計算的基礎包。它是一個Python庫,提供多維數組對象,各...
摘要:屬于前一種,而且日益被用于數學計算機器學習和多種數據科學應用。近來,由于擁有多個針對機器學習自然語言處理數據視覺化數據探索數據分析和數據挖掘的插件,豐富的數據科學生態體系得到了較大的發展,甚至有將數據科學社區化的趨勢。 譯者注:本文的英文原文地址是:Python for Data Science vs Python for Web Development,發布時間是10月29日。譯者一...
閱讀 1960·2021-09-04 16:45
閱讀 747·2019-08-30 15:44
閱讀 893·2019-08-30 13:07
閱讀 456·2019-08-29 16:06
閱讀 1375·2019-08-29 13:43
閱讀 1269·2019-08-26 17:00
閱讀 1526·2019-08-26 13:51
閱讀 2294·2019-08-26 11:48