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