維度:一組數據的組織形式python
一維數據程序員
一維數據由對等關係的有序或無序數據構成,採用線性方式組織算法
列表和數組:一組數據的有序結構數組
列表:數據類型能夠不一樣 3.1413, 'pi', 3.1404, [3.1401, 3.1349], '3.1376' 數組:數據類型相同 3.1413, 3.1398, 3.1404, 3.1401, 3.1349, 3.1376
二維數據app
二維數據由多個一維數據構成,是一維數據的組合形式函數
表格是典型的二維數據其中,表頭是二維數據的一部分工具
多維數據性能
多維數據由一維或二維數據在新維度上擴展造成優化
高維數據spa
高維數據僅利用最基本的二元關係展現數據間的複雜結構
{ "firstName":"Tian", "lastName" :"Song", "adress" :{ "streetAddr":"中關村南大街5號", "city" :"北京市", "zipcode" :"100081" }, "prof" :["Computer System", "Security"] }
數據維度的Python表示
一維數據:列表和集合類型
[3.1398, 3.1349, 3.1376] 有序
{3.1398, 3.1349, 3.1376} 無序
二維數據:列表類型
[ [3.1398, 3.1349, 3.1376],
[3.1413, 3.1404, 3.1401] ]
多維數據:列表類型
高維數據:字典類型 或數據表示格式
dict = { "firstName":"Tian", "lastName" :"Song", }
NumPy(Numerical Python的縮寫)是一個開源的Python科學計算庫。使用NumPy,就能夠很天然地使用數組和矩陣。NumPy包含不少實用的數學函數,涵蓋線性代數運算、傅里葉變換和隨機數生成等功能。若是你的系統中已經裝有LAPACK,NumPy的線性代數模塊會調用它,不然NumPy將使用本身實現的庫函數。LAPACK是一個著名的數值計算庫,最初是用ortran寫成的,Matlab一樣也須要調用它。從某種意義上講,NumPy能夠取代Matlab和Mathematica的部分功能,而且容許用戶進行快速的交互式原型設計。
NumPy是一個開源的Python科學計算基礎庫,包含:
NumPy是SciPy、Pandas等數據處理或科學計算庫的基礎
對於一樣的數值計算任務,使用NumPy要比直接編寫Python代碼便捷得多。這是由於NumPy可以直接對數組和矩陣進行操做,能夠省略不少循環語句,其衆多的數學函數也會讓編寫代碼的工做輕鬆許多。NumPy的底層算法在設計時就有着優異的性能,而且經受住了時間的考驗。NumPy是開源的,這意味着使用NumPy能夠享受到開源帶來的全部益處。價格低到了極限——免費。雖然NumPy自己不能用來繪圖,可是Matplotlib和NumPy二者完美地結合在一塊兒,其繪圖能力可與Matlab相媲美。
爲了更好的進行科學計算,須要理解numpy的構成原理以及其中最關鍵的對象ndarry。
N維數組對象:ndarray
Python已有列表類型,爲何須要一個數組對象(類型)?
經過一個實例進行上述問題的分析:
例:計算A^2+B^3
在python中計算
# calculae A^2+B^3 def pySum(): a = [0, 1, 2, 3, 4] b = [9, 8, 7, 6, 5] c = [] for i in range(len(a)): c.append(a[i]**2 + b[i]**3) return c print(pySum()) # 輸出結果 [729, 513, 347, 225, 141]
在引入numpy以後計算
# calculae A^2+B^3 numpy import numpy as np # AB屬於同一維度時,能夠直接運算,不然會報錯 def npSum(): a = np.array([0, 1, 2, 3, 4]) b = np.array([9, 8, 7, 6, 5]) c = a**2 + b**3 return c print(npSum()) # 輸出結果 [729 513 347 225 141]
經過上述兩種運算方式的比較,能夠得出所提問題的解:
ndarray是一個多維數組對象,由兩部分構成:
ndarray數組通常要求全部元素類型相同(同質),數組下標從0開始
ndarray實例
ndarry中兩個重要的概念:軸(axis): 保存數據的維度;秩(rank):軸的數量
# ndarray import numpy as np # ndarray在程序中的別名是 array # np.array()生成一個ndarray數組 a = np.array([[1, 2, 3],[4, 5, 6]]) b = np.array([7, 8, 9]) # np.array()輸出成[]形式,元素由空格分割 print(a) # 輸出結果 [[1 2 3] [4 5 6]] print(b) # 輸出結果 [7 8 9]
ndarray對象的屬性
屬性 | 說明 |
---|---|
.ndim | 秩,即軸的數量或維度的數量 |
.shape | ndarray對象的尺度,對於矩陣,n行m列 |
.size | ndarray對象元素的個數,至關於.shape中n*m的值 |
.dtype | ndarray對象的元素類型 |
.itemsize | ndarray對象中每一個元素的大小,以字節爲單位 |
元素屬性實例
import numpy as np a = np.array([[1, 2, 3],[4, 5, 6]]) print(a.ndim) # 2 print(a.shape) # (2,3) print(a.size) # 6 print(a.dtype) # int32 print(a.itemsize) # 4
ndarray的元素類型(1) (表格在Word210%顯示下截圖)
ndarray的元素類型(2)
ndarray的元素類型(3)
ndarray爲何要支持這麼多種元素類型?
非同質ndarray對象沒法有效發揮NumPy優點,儘可能避免使用,實例以下
# ndarray非同質對象 import numpy as np x = np.array([[0,1],[2,3,4]]) print(x.shape) # (2,) print(x.dtype) # object print(x.size) # 2 print(x.ndim) # 1 print(x.itemsize) # 8 y = np.array([[0,1],[2,3]]) print(y.shape) # (2,2) print(y.dtype) # int32 print(y.size) # 4 print(y.ndim) # 2 print(y.itemsize) # 4
具體用法以下
# 建立numpy數組 import numpy as np x = np.arange(10) print(x) # 輸出結果 [0 1 2 3 4 5 6 7 8 9] x = np.ones((3,6)) print(x) # 輸出結果 [[1. 1. 1. 1. 1. 1.] [1. 1. 1. 1. 1. 1.] [1. 1. 1. 1. 1. 1.]] x = np.zeros((3,6)) print(x) # 輸出結果 [[0. 0. 0. 0. 0. 0.] [0. 0. 0. 0. 0. 0.] [0. 0. 0. 0. 0. 0.]] x = np.ones((2,3,4)) print(x) # 輸出結果 [[[1. 1. 1. 1.] [1. 1. 1. 1.] [1. 1. 1. 1.]] [[1. 1. 1. 1.] [1. 1. 1. 1.] [1. 1. 1. 1.]]] x = np.eye(5) print(x) # 輸出結果 [[1. 0. 0. 0. 0.] [0. 1. 0. 0. 0.] [0. 0. 1. 0. 0.] [0. 0. 0. 1. 0.] [0. 0. 0. 0. 1.]]
具體用法以下
# 建立numpy數組 import numpy as np x = np.eye(5) print(x) # 輸出結果 [[1. 0. 0. 0. 0.] [0. 1. 0. 0. 0.] [0. 0. 1. 0. 0.] [0. 0. 0. 1. 0.] [0. 0. 0. 0. 1.]] y = np.ones_like(x) print(y) # 輸出結果 [[1. 1. 1. 1. 1.] [1. 1. 1. 1. 1.] [1. 1. 1. 1. 1.] [1. 1. 1. 1. 1.] [1. 1. 1. 1. 1.]] y = np.zeros_like(x) print(y) # 輸出結果 [[0. 0. 0. 0. 0.] [0. 0. 0. 0. 0.] [0. 0. 0. 0. 0.] [0. 0. 0. 0. 0.] [0. 0. 0. 0. 0.]] y = np.full_like(x,5) print(y) # 輸出結果 [[5. 5. 5. 5. 5.] [5. 5. 5. 5. 5.] [5. 5. 5. 5. 5.] [5. 5. 5. 5. 5.] [5. 5. 5. 5. 5.]]
具體用法以下
import numpy as np a = np.linspace(1, 10, 4) print(a) # 輸出結果 [ 1. 4. 7. 10.] b = np.linspace(1, 10, 4, endpoint=False) # 不包含最後一個元素10,分紅5份 print(b) # 輸出結果 [1. 3.25 5.5 7.75] c = np.concatenate((a, b)) print(c) # 輸出結果 [ 1. 4. 7. 10. 1. 3.25 5.5 7.75]
對於建立後的ndarray數組,能夠對其進行維度變換和元素類型變換
ndarray數組的維度變換
方法 |
說明 |
.reshape(shape) |
不改變數組元素,返回一個shape形狀的數組,原數組不變 |
.resize(shape) |
與.reshape()功能一致,但修改原數組 |
.swapaxes(ax1,ax2) |
將數組n個維度中兩個維度進行調換 |
.flatten() |
對數組進行降維,返回摺疊後的一維數組,原數組不變 |
實例以下
# numpy數組變化 import numpy as np a = np.ones((2,3,4)) print(a) # 輸出結果 [[[1. 1. 1. 1.] [1. 1. 1. 1.] [1. 1. 1. 1.]] [[1. 1. 1. 1.] [1. 1. 1. 1.] [1. 1. 1. 1.]]] b = a.reshape((3,8)) print(b) # 輸出結果 [[1. 1. 1. 1. 1. 1. 1. 1.] [1. 1. 1. 1. 1. 1. 1. 1.] [1. 1. 1. 1. 1. 1. 1. 1.]]
ndarray數組的類型變換
# numpy數組元素類型變化 import numpy as np a = np.ones((2,3), dtype=np.int) print(a) # 輸出結果 [[1 1 1] [1 1 1]] b = a.astype(np.float) print(b) # 輸出結果 [[1. 1. 1.] [1. 1. 1.]]
# numpy數組的操做 import numpy as np a = np.arange(24).reshape(2,3,4) print(a) # 輸出結果 [[[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]] [[12 13 14 15] [16 17 18 19] [20 21 22 23]]] print(a[1,2,3]) # 23 print(a[0,1,2]) # 6 print(a[-1,-2,-3]) # 17
數組的切片
print(a[:,1,-3]) # [ 5 17] print(a[:,1:3,:]) # 1:3 左閉右開,包含1,不包含3 # 輸出結果 [[[ 4 5 6 7] [ 8 9 10 11]] [[16 17 18 19] [20 21 22 23]]] print(a[:,:,::2]) # 輸出結果 [[[ 0 2] [ 4 6] [ 8 10]] [[12 14] [16 18] [20 22]]]
數組與標量之間的運算
# numpy數組的運算 import numpy as np a = np.arange(24).reshape(2,3,4) print(a.mean()) # 11.5 a = a/a.mean() print(a) # 輸出結果 [[[0. 0.08695652 0.17391304 0.26086957] [0.34782609 0.43478261 0.52173913 0.60869565] [0.69565217 0.7826087 0.86956522 0.95652174]] [[1.04347826 1.13043478 1.2173913 1.30434783] [1.39130435 1.47826087 1.56521739 1.65217391] [1.73913043 1.82608696 1.91304348 2. ]]]
Numpy的運算函數
NumPy一元函數
NumPy二元函數