Numpy库入门
數據的維度
維度:一組數據的組織形式
一維數據
一維數據由對等關系的有序或無序數據構成,采用線性方式組織
列表和數組:一組數據的有序結構
列表:數據類型可以不同3.1413, 'pi', 3.1404, [3.1401, 3.1349], '3.1376'數組:數據類型相同3.1413, 3.1398, 3.1404, 3.1401, 3.1349, 3.1376二維數據
二維數據由多個一維數據構成,是一維數據的組合形式
表格是典型的二維數據其中,表頭是二維數據的一部分
多維數據
多維數據由一維或二維數據在新維度上擴展形成
高維數據
高維數據僅利用最基本的二元關系展示數據間的復雜結構
{"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是什么
NumPy(Numerical Python的縮寫)是一個開源的Python科學計算庫。使用NumPy,就可以很自然地使用數組和矩陣。NumPy包含很多實用的數學函數,涵蓋線性代數運算、傅里葉變換和隨機數生成等功能。如果你的系統中已經裝有LAPACK,NumPy的線性代數模塊會調用它,否則NumPy將使用自己實現的庫函數。LAPACK是一個著名的數值計算庫,最初是用ortran寫成的,Matlab同樣也需要調用它。從某種意義上講,NumPy可以取代Matlab和Mathematica的部分功能,并且允許用戶進行快速的交互式原型設計。
NumPy是一個開源的Python科學計算基礎庫,包含:
- 一個強大的N維數組對象 ndarray
- 廣播功能函數
- 整合C/C++/Fortran代碼的工具
- 線性代數、傅里葉變換、隨機數生成等功能
NumPy是SciPy、Pandas等數據處理或科學計算庫的基礎
為什么使用Numpy
對于同樣的數值計算任務,使用NumPy要比直接編寫Python代碼便捷得多。這是因為NumPy能夠直接對數組和矩陣進行操作,可以省略很多循環語句,其眾多的數學函數也會讓編寫代碼的工作輕松許多。NumPy的底層算法在設計時就有著優異的性能,并且經受住了時間的考驗。NumPy是開源的,這意味著使用NumPy可以享受到開源帶來的所有益處。價格低到了極限——免費。雖然NumPy本身不能用來繪圖,但是Matplotlib和NumPy兩者完美地結合在一起,其繪圖能力可與Matlab相媲美。
Numpy的數組對象:ndarry
為了更好的進行科學計算,需要理解numpy的構成原理以及其中最關鍵的對象ndarry。
N維數組對象:ndarray
Python已有列表類型,為什么需要一個數組對象(類型)?
通過一個實例進行上述問題的分析:
例:計算A^2+B^3
在python中計算
# calculae A^2+B^3def 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**3return c print(npSum())# 輸出結果 [729 513 347 225 141]通過上述兩種運算方式的比較,可以得出所提問題的解:
- 數組對象可以去掉元素間運算所需的循環,使一維向量更像單個數據
- 設置專門的數組對象,經過優化,可以提升這類應用的運算速度
- 科學計算中,一個維度所有數據的類型往往相同
- 數組對象采用相同的數據類型,有助于節省運算和存儲空間
ndarray是一個多維數組對象,由兩部分構成:
- 實際的數據
- 描述這些數據的元數據(數據維度、數據類型等)
ndarray數組一般要求所有元素類型相同(同質),數組下標從0開始
ndarray實例
ndarry中兩個重要的概念:軸(axis): 保存數據的維度;秩(rank):軸的數量
# ndarrayimport 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) # 4ndarry數組的元素類型
ndarray的元素類型(1)?(表格在Word210%顯示下截圖)
ndarray的元素類型(2)?
ndarray的元素類型(3)?
ndarray為什么要支持這么多種元素類型?
- 對比:Python語法僅支持整數、浮點數和復數3種類型
- 科學計算涉及數據較多,對存儲和性能都有較高要求
- 對元素類型精細定義,有助于NumPy合理使用存儲空間并優化性能
- 對元素類型精細定義,有助于程序員對程序規模有合理評估
非同質ndarray對象無法有效發揮NumPy優勢,盡量避免使用,實例如下
# ndarray非同質對象 import numpy as npx = 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) # 4ndarry數組的變換ndarry數組的創建?
- 從Python中的列表、元組等類型創建ndarray數組
- 使用NumPy中函數創建ndarray數組,如:arange,?ones,?zeros等
?具體用法如下
# 創建numpy數組 import numpy as npx = 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 npx = 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]- 從字節流(raw?bytes)中創建ndarray數組
- 從文件中讀取特定格式,創建ndarray數組
ndarray數組的變換
對于創建后的ndarray數組,可以對其進行維度變換和元素類型變換
ndarray數組的維度變換
| 方法 | 說明 |
| .reshape(shape) | 不改變數組元素,返回一個shape形狀的數組,原數組不變 |
| .resize(shape) | 與.reshape()功能一致,但修改原數組 |
| .swapaxes(ax1,ax2) | 將數組n個維度中兩個維度進行調換 |
| .flatten() | 對數組進行降維,返回折疊后的一維數組,原數組不變 |
實例如下
# numpy數組變化import numpy as npa = 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 npa = 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.]]ndarry數組的操作
# 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]]]ndarry數組的運算
數組與標量之間的運算
# 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二元函數
轉載于:https://www.cnblogs.com/Robin5/p/11479665.html
總結
- 上一篇: 防火墙对FTP主动和被动模式的影响
- 下一篇: FTP笔记-FTP主动模式和被动模式