NumPy基本使用
簡介
一句話介紹
NumPy是高性能科學計算和數據分析的基礎包。它是pandas等其他各種工具的基礎。
主要功能
注意:數組不同與python中列表,數組中的元素類型是一致的,并且數組長度也是確定的。
安裝
pip install numpy引用方式
import numpy as np創建ndarray對象
創建
a = np.array([1,2,3,4])常用屬性
T 數組的轉置(對高維數組而言)
a = np.arange(6).reshape(2,3) """ array([[0, 1, 2],[3, 4, 5]]) """a.T """ array([[0, 3],[1, 4],[2, 5]]) """?
dtype 數組元素的數據類型:
- bool_, int(8,16,32,64), uint(8,16,32,64), float(16,32,64)
- 類型轉換:astype()
size 數組元素的個數
ndim 數組的維數
shape 數組的維度大小(以元組形式)
創建ndarray對象的方式
array() 將列表轉換為數組,可選擇顯式指定dtype
arange() range的numpy版,支持浮點數(步長可以是小數)
a = np.arange(1, 10, 1.2) """ array([ 1. , 2.2, 3.4, 4.6, 5.8, 7. , 8.2, 9.4]) """# 一維轉二維:reshape()方法a = np.arange(15).reshape(3,5) """ array([[ 0, 1, 2, 3, 4],[ 5, 6, 7, 8, 9],[10, 11, 12, 13, 14]]) """?
linspace() 類似arange(),第三個參數為數組長度(分為幾份);(補充:計算機不能表示連續的的東西,比如計算機繪制函數圖,其實就是打點,將一段數分為盡可能多的份數)
a = np.linspace(0, 10, 6) """ array([ 0., 2., 4., 6., 8., 10.]) """?
zeros() 根據指定形狀和dtype創建全0數組
a = np.zeros(10) """ step 1:假如一個數字占4個字節(32為機器),劃分40字節的內存空間 step 2: 對這些內存空間清零(默認是浮點型) array([ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]) """# 創建二維數組(理解為表格)a = np.zeros((3,5), dtype='int') """ array([[0, 0, 0, 0, 0],[0, 0, 0, 0, 0],[0, 0, 0, 0, 0]]) """# 創建三位數組(理解為一本表格,有3頁,每頁4行5列)a = np.zeros((3,4,5), dtype='int') """ array([[[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],[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],[0, 0, 0, 0, 0],[0, 0, 0, 0, 0]]]) """?
ones() 根據指定形狀和dtype創建全1數組
empty() 根據指定形狀和dtype創建空數組(隨機值)
a = np.empty(10) """ 比起zeros() 少了第二步(內存空間內還存在原來的值),因此如果創建完數組確定要重新賦值,可以選擇這種方式,速度快。 array([ 1., 2., 3., 4., 5., 6., 7., 8., 9., 10.]) """?
eye() 根據指定邊長和dtype創建單位矩陣
tolist() ndarray對象(數組)轉列表:
索引和切片
簡單計算
數組和數字(向量與標量)之間
a = np.array([1,2,3,4])b = a + 1 # array([2, 3, 4, 5]) b = a * 3 # array([ 3, 6, 9, 12]) b = 1 / a # array([ 1. , 0.5 , 0.33333333, 0.25 ]) b = 1 // a # array([1, 0, 0, 0], dtype=int32) b = a ** 0.5 # array([ 1. , 1.41421356, 1.73205081, 2. ])同樣大小數組之間的運算
a = np.array([1,2,3,4]) b = np.array([5,6,7,8])a + b # array([ 6, 8, 10, 12]) a / b # array([ 0.2 , 0.33333333, 0.42857143, 0.5 ]) a ** b # array([ 1, 64, 2187, 65536], dtype=int32)數組的索引
# 一維數組,同python中的列表 a = np.arange(10) a[3] # 3 ## 二維數組,用逗號,逗號左邊是行,右邊是列 a = np.arange(10).reshape(2,5) ''' array([[0, 1, 2, 3, 4],[5, 6, 7, 8, 9]]) ''' a[1,3] # 第1行第3個元素:8數組的切片(顧頭不顧尾)
# 一維切片,同python中的列表# 二維切片 a = np.arange(15).reshape(3,5) """ array([[ 0, 1, 2, 3, 4],[ 5, 6, 7, 8, 9],[10, 11, 12, 13, 14]]) """# 對數組a 6-8-11-13的矩形區域切片 # 用逗號,逗號左邊是行,右邊是列:從第1行切到最后,再從第一列切到第4列(不包含) a[1:, 1:4] # """ array([[ 6, 7, 8],[11, 12, 13]]) """# 切片的拷貝問題 a = np.arange(10) # array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) b = a[0:5] # array([0, 1, 2, 3, 4]) b[1] = 666 """ a array([ 0, 666, 2, 3, 4, 5, 6, 7, 8, 9])注意: 如果是python的列表,對a切片賦值給b是深拷貝,會劃分新的內存空間,對b中元素的修改不影響a 但是,對于ndarray對象,由于常用來處理大數據,默認執行的是淺拷貝(數據量太大,深拷貝費空間),b相當于是a的一個視圖,因此對b中元素的修改,將導致對a的修改 """# 解決方案: b = a[0:5].copy() # 執行深拷貝,這樣對b中元素的修改不會影響a布爾型索引
問題1:給一個數組,選出數組中所有大于5的數。
a = np.array([1,3,8,9,11,2]) a[a>5] # array([ 8, 9, 11])""" a>5會對a中的每一個元素進行判斷,返回一個布爾數組 布爾型索引:將同樣大小的布爾數組傳進索引,會返回一個由所有True對應位置的元素的數組 """問題2:給一個數組,選出數組中所有大于5的偶數。
a = np.array([1,3,8,9,11,2]) a[(a>5) & (a%2==0)] # array([8])""" 注意:兩個條件必須用括號括起來,因為 & 運算符的優先級高 """問題3:給一個數組,選出數組中所有大于5的數和偶數。
a = np.array([1,3,8,9,11,2]) a[(a>5) | (a%2==0)] # array([ 8, 9, 11, 2])注意,非 的邏輯運算符是 ~ 飄號
a = np.array([True, False]) ~a # array([False, True], dtype=bool)花式索引
中括號中存的是用逗號分隔的下標
# 一維 a = np.arange(1,10) # array([1, 2, 3, 4, 5, 6, 7, 8, 9])b = [1, 3, 6] # [] 中存的是下標 a[b] # array([2, 4, 7])# 二維 a =np.arange(15).reshape(3,5) """ array([[ 0, 1, 2, 3, 4],[ 5, 6, 7, 8, 9],[10, 11, 12, 13, 14]]) """# 切片其中的 6 8 11 13 a[1:,[1, 3]] """ array([[ 6, 8],[11, 13]]) """# 選出其第一列和第三列,組成新的二維數組。 a =np.arange(15).reshape(3,5) a[:,[1,3]] """ array([[ 1, 3],[ 6, 8],[11, 13]]) """# 注意,不要在逗號的左右兩邊同時使用花式索引 a[[1,2],[1,3]] """ array([ 6, 13]) """通用函數
概念:能同時對數組中所有元素進行運算的函數
一元函數
abs, sqrt, exp, log, ceil, floor, rint, trunc, modf, isnan, isinf, cos, sin, tan
ceil, floor, rint, trunc 這幾個函數用于浮點數轉整數;trunc相當于python中的int();rint()四舍五入,相當與python中的round();
isnan, isinf,用于判斷是nan 和 inf;注意, nan, inf 是浮點數的兩個特殊值:
isinf表示無限大,是一個float型(5/0 除數越小,結果越大,除數趨近于零時,就是無限大。)
而nan, 表示不是一個數,甚至也不等于它本身!
a = np.array([1,2,3,4,5]) b = np.array([1,1,1,1,0])c = a/b # array([ 1., 2., 3., 4., inf]) np.isinf(c) # array([False, False, False, False, True], dtype=bool) c[~np.isinf(c)] # 布爾索引 array([ 1., 2., 3., 4.])float('inf') # inf type(float('inf')) # floatfloat('nan') # nan type(float('nan')) # float# nan不等于任何數 float('nan') == 1.5 # False float('nan') == float('inf') # False float('nan') == float('nan') # False二元函數
add, substract, multiply, divide, power, mod, 這些二元函數用的相對較少,因為可以直接用 符號
maximum, mininum, 比較兩個數組,取其中最大/最小部分構成新的數組
a = np.array([1, 2, 3, 4, 5]) b = np.array([2, 3, 4, 1, 6]) np.maximum(a,b) """ array([2, 3, 4, 4, 6]) """數學和統計方法
調用方式:np.func(obj)或obj.func()
sum 求和
mean 求平均數
std 求標準差(方差開根號)
var 求方差(每個數減平均值再平方的結果,相加求平均
平均值一樣時,方差/標準查,反映數據的離散程度
# a, b, c三個數組的平均值相同 a = np.array([7,8,10,8,7]) b = np.array([8,8,8,8,8]) c = np.array([10,8,6,10,6])# 通過方差反映離散程度 np.var(a) # 1.2 np.var(b) # 0.0 np.var(c) # 3.2000000000000002均值加減 n倍的標準差,可以估計數據的范圍
import random a = np.array([random.uniform(10,20) for i in range(10)]) """ array([ 14.59699686, 12.69868323, 11.06636046, 11.62997516,14.65875624, 12.84485756, 14.87239277, 10.47546367,12.55186776, 14.45094081]) """# 一倍 a.mean() - a.std()*1 # 11.460966440505564 a.mean() + a.std()*1 # 14.508292464563356# 二倍 a.mean() - a.std()*2 # 9.9373034284766675 a.mean() + a.std()*2 # 16.031955476592252min 求最小值
max 求最大值
argmin 求最小值索引
argmax 求最大值索引
隨機數生成
隨機數函數在np.random子包中,比起Python的random模塊,其可以產生二維數組
rand 給定形狀產生隨機數組(0到1之間的數)
randint 給定形狀產生隨機整數
np.random.randint(10,20,(3,5)) """ array([[15, 14, 15, 16, 14],[14, 12, 10, 10, 13],[12, 12, 13, 10, 18]]) """choice 給定形狀產生隨機選擇
np.random.choice([1,2,3,4,5],10) """ array([4, 1, 3, 4, 2, 1, 5, 5, 3, 1]) """np.random.choice([1,2,3,4,5],(3,5)) """ array([[1, 5, 3, 3, 1],[4, 3, 1, 4, 2],[3, 3, 5, 3, 3]]) """shuffle 與random.shuffle相同
uniform 給定形狀產生隨機浮點數組
a = np.random.uniform(10,20,(3,5)) """ array([[ 11.08600377, 10.59471275, 16.25737906, 11.0429535 ,16.12688335],[ 15.38383353, 10.8729155 , 14.77521291, 13.75258492,14.54417658],[ 17.8514871 , 13.61437731, 16.87297584, 14.22388704,18.50198588]]) """總結
- 上一篇: [转载] 七龙珠第一部——第121话 悟
- 下一篇: scrapy框架架构