我的Python分析成长之路8
Numpy數(shù)值計(jì)算基礎(chǔ)
Numpy:是Numerical Python的簡稱,它是目前Python數(shù)值計(jì)算中最為基礎(chǔ)的工具包,Numpy是用于數(shù)值科學(xué)計(jì)算的基礎(chǔ)模塊,不但能夠完成科學(xué)計(jì)算的任而且能夠用作高效的多維數(shù)據(jù)容器,可用于存儲(chǔ)和處理大型矩陣。Numpy的數(shù)據(jù)容器能夠保存任意類型的數(shù)據(jù),這使得Numpy可以無縫并快速地整合各種數(shù)據(jù)。Numpy本身并沒有提供很多高效的數(shù)據(jù)分析功能。理解Numpy數(shù)組即數(shù)組計(jì)算有利于更加高效地使用其他如pandas等數(shù)據(jù)分析工具。
Numpy提供了兩種基本的對(duì)象:ndarray(多維數(shù)組對(duì)象)和ufunc(通用函數(shù))
1.數(shù)組屬性:
ndim:返回int 。數(shù)組的維度
shape:返回tuple。表示數(shù)組的尺寸,對(duì)于n行m列的矩陣,形狀為(m,n)
size:返回int。表示數(shù)組的元素整數(shù),等于數(shù)組形狀的乘積
dtype:返回data-typle。描述數(shù)組中元素的類型
itemsize:返回int。表示數(shù)組中每個(gè)元素的大小(以字節(jié)為單位)
1 import numpy as np 2 arr1 = np.arange(9).reshape(3,3) 3 print("創(chuàng)建數(shù)組:",arr1) 4 print("數(shù)組的維度:",arr1.ndim) 5 print("數(shù)組的尺寸(形狀):",arr1.shape) 6 print("數(shù)組的數(shù)據(jù)類型:",arr1.dtype) 7 print("數(shù)據(jù)元素個(gè)數(shù):",arr1.size) 8 print("數(shù)據(jù)每個(gè)元素大小:",arr1.itemsize)
2.數(shù)組創(chuàng)建
一、生成多維數(shù)組最簡單的方式就是使用array函數(shù),array函數(shù)接受任意的序列型對(duì)象(當(dāng)然也包括其他的數(shù)組)。
基本語法法:numpy.array(object,dtype=None,copy=True,order='K',subok=False,ndmin=0)
1.object 接受array。表示想要?jiǎng)?chuàng)建的數(shù)組.無默認(rèn)
2.dtype 接受data-type.表示數(shù)組所需的數(shù)據(jù)類型。默認(rèn)為None
3.ndmin 接受int。指定數(shù)組的最小維度。默認(rèn)為None
import numpy as np data1 = [1,2,3,4,5] data2 = [[1,2,3,4],[5,6,7,8]] print("生成一維數(shù)組:",np.array(data1)) #生成一維數(shù)組 print("生成二維數(shù)組:",np.array(data2)) #生成二維數(shù)組
二、使用其他函數(shù)創(chuàng)建數(shù)組
1 import numpy as np 2 print("使用arange函數(shù)生成數(shù)組:",np.arange(0,10,1)) #左閉右開 3 print("使用linspace函數(shù)生成數(shù)組:",np.linspace(0,9,10)) #閉區(qū)間 4 print("使用logspace函數(shù)生成數(shù)組:",np.logspace(0,2,10)) #[1,100]生成10個(gè)數(shù) 5 print("使用zeros函數(shù)生成數(shù)組:",np.zeros((2,3))) #生成二行三列全為0的數(shù)組 6 print("使用ones函數(shù)生成數(shù)組:",np.ones((2,3))) #生成二行三列全為一的數(shù)組 7 print("使用eye函數(shù)生成數(shù)組:",np.ones(3)) #生成對(duì)角線上為一的數(shù)組 8 print("使用diag函數(shù)生成數(shù)組:",np.diag([1,2,3,4]))
3.數(shù)組的數(shù)據(jù)類型
在Numpy中,所欲數(shù)組的數(shù)據(jù)類型是同質(zhì)的,即數(shù)組中的所有元素必須是一致的。這樣做的好處,更容易確定數(shù)組所需要的存儲(chǔ)空間。
bool :用一位存儲(chǔ)的布爾類型(True or False)
inti:由所在平臺(tái)決定其精度的整數(shù)
int8:整數(shù) 范圍為:-128~127
int16:整數(shù) 范圍為:-32768~32767
int32:整數(shù) 范圍為:-2^31~2^32-1
int64:整數(shù) 范圍為:-2^63~2^63-1
unit8:無符號(hào)整數(shù) 范圍為:0~255
unit16:無符號(hào)整數(shù) 范圍為:0~65535
unit32:無符號(hào)整數(shù) 范圍為0~2^32-1
unit64 無符號(hào)整數(shù) 范圍為0~2^64-1
float16:半精度浮點(diǎn)數(shù)
float32:單精度浮點(diǎn)數(shù)
float64: 雙精度浮點(diǎn)數(shù)
complex64 復(fù)數(shù) 分別用32為浮點(diǎn)數(shù)代表實(shí)部和虛部
complex128/comple 復(fù)數(shù)分別用64位浮點(diǎn)數(shù)表示實(shí)部和虛部
np.dtype() 查看數(shù)據(jù)類型
print(np.float(32)) #整形轉(zhuǎn)化為浮點(diǎn)型 print(np.int(42.0)) #浮點(diǎn)型轉(zhuǎn)化為整形 print(np.bool(42)) #整形轉(zhuǎn)化為bool型 print(np.float(True)) #bool型轉(zhuǎn)化為浮點(diǎn)型
4.生成隨機(jī)數(shù)
Numpy提供了強(qiáng)大的生成隨機(jī)數(shù)的功能,但使用的都是偽隨機(jī)數(shù).random 是最常見的生成隨機(jī)數(shù)的方法.
1 print("生成隨機(jī)數(shù):",np.random.random()) 2 print("生成均勻分布的隨機(jī)數(shù)",np.random.rand(10,5)) 3 print("生成正態(tài)分布的隨機(jī)數(shù)",np.random.randn(10,5)) 4 print("生成給定上下限的隨機(jī)數(shù):",np.random.randint(0,10,size=[5,2])) 5 print("生成二項(xiàng)分布隨機(jī)數(shù):",np.random.binomial(10,0,(2,3))) 6 print("生成beta分布隨機(jī)數(shù):",np.random.beta(0.2,0.3,(2,3))) 7 print("生成卡方分布隨機(jī)數(shù):",np.random.chisquare(10,[5,2])) 8 print("生成gamma分布隨機(jī)數(shù):",np.random.gamma(10,1,(5,2))) 9 print("生成任意期間均勻分布隨機(jī)數(shù):",np.random.uniform(0,10,(5,2)))
5.通過索引訪問數(shù)組
1.一維數(shù)組的索引
一維數(shù)組的索引比較簡單,與Python中l(wèi)ist的索引方法類似:如果你傳遞一個(gè)數(shù)值給數(shù)組的切片,數(shù)值會(huì)被傳遞給整個(gè)切片。區(qū)別于Python的內(nèi)建列表,數(shù)組的切片是原數(shù)組的視圖。這意味著數(shù)據(jù)并不是被復(fù)制,任何對(duì)于視圖的修改都會(huì)反映到原數(shù)組上。
1 arr1 = np.arange(10) 2 print(arr1[1]) #獲得索引為1的值 3 print(arr1[1:3]) #獲得索引為1,2的值 4 arr1[2:4] = 12 5 print(arr1) #[ 0 1 12 12 4 5 6 7 8 9] 獲得 6 x = arr1[1:3].copy() #如果不想要獲得是一份視圖的話,就用顯示的復(fù)制這個(gè)數(shù)組 .copy() 7 print(arr1)
2.多維數(shù)組的索引
多維數(shù)組的每一個(gè)維度都有一個(gè)索引,各個(gè)維度的索引之間用逗號(hào)隔開,或分兩個(gè)括號(hào)
1 arr= np.arange(9).reshape(3,3) 2 print(arr[0][2]) #2 3 print(arr[0,2]) #2 這兩種方式訪問等價(jià) 4 print(arr[1:,1:]) #第二、三行,第二、三列 5 print(arr[:2,2]) #前兩行,第三列 6 arr2 = np.array([[[1,2,3],[4,5,6]],[7,8,9],[10,11,12]]) 7 print(arr2[0]) #[[1, 2, 3], [4, 5, 6]] 8 print(arr2[0][0]) #[1, 2, 3]
3.布爾索引?
1 names = np.array(["A","B","C","D","E","F"]) 2 data = np.random.randn(6,4) 3 print(names=="B") #[False True False False False False] 4 print(data[names=='B']) #在索引數(shù)組中引入布爾數(shù)組 選擇names=="B"的行 5 print(data[names=='B',2:]) #names ="B" 的后兩列
6.改變數(shù)組的形態(tài)
在對(duì)數(shù)組進(jìn)行操作時(shí),經(jīng)常需要改變數(shù)組的維度。在Numpy中,常用reshape函數(shù)改變數(shù)組的“形狀”,也就是改變數(shù)組的維度。參數(shù)為一個(gè)正整數(shù)元組,分別指定數(shù)組在每個(gè)維度上的大小,reshape函數(shù)在改變?cè)紨?shù)據(jù)形狀的同時(shí)不改變?cè)紨?shù)據(jù)。如果指定的數(shù)據(jù)和數(shù)組的元素不吻合,則函數(shù)將拋出異常。
使用ravel()、flatten()完成展開工作,使用hstack()、vstack() 、concatenate完成組合操作,使用hsplit、vsplit、dsplit、split完成分割操作,可以將數(shù)組分割成相同大小的子數(shù)組,也可以指定原數(shù)組中需要分割的位置。
1 arr = np.arange(12) 2 print("創(chuàng)建一維數(shù)組:",arr) 3 print("新的數(shù)組:",arr.reshape(3,4)) #返回(3,4)的數(shù)組 4 print("數(shù)組的維度:",arr.ndim) #查看數(shù)組的維度 2 5 arr2 = np.arange(12).reshape(3,4) 6 print("創(chuàng)建的二維數(shù)組:",arr2) 7 print("使用ravel展平:",arr2.ravel()) #獲得一維數(shù)組[ 0 1 2 3 4 5 6 7 8 9 10 11] 8 print("使用flatten橫向展開:",arr2.flatten()) #橫向展開 [ 0 1 2 3 4 5 6 7 8 9 10 11] 9 print("使用flatten縱向展開:",arr2.flatten("F")) #縱向展開,[ 0 4 8 1 5 9 2 6 10 3 7 11] 10 arr3 = arr2 *3 11 print("使用hstack完成橫向組合:",np.hstack((arr2,arr3))) #橫向組合 12 print("使用vstack完成縱向組合:",np.vstack((arr2,arr3))) #縱向組合 13 print("使用concatenate完成縱向組合操作",np.concatenate((arr2,arr3),axis=0)) #沿著縱向組合 14 print("使用concatenate完成橫向組合操作",np.concatenate((arr2,arr3),axis=1)) #沿著橫向組合 15 print("橫向分割:",np.hsplit(arr2,2)) #使用hsplit完成橫向分割 16 arr4 = np.arange(16).reshape(4,4) 17 print("縱向分割:",np.vsplit(arr4,2)) #使用vstack完成縱向分割 必須保證分割后相同大小 18 print("橫向分割:",np.split(arr4,axis=1)) #完成橫向分割 19 print("縱向分割:",np.split(arr4,axis=0)) #完成縱向分割
7.創(chuàng)建numpy矩陣
在Numpy中,矩陣是ndarray的子類,在Numpy中,數(shù)組和矩陣有著重要的區(qū)別.Numpy中提供了兩個(gè)基本的對(duì)象:一個(gè)N維數(shù)組對(duì)象和一個(gè)通用函數(shù)對(duì)象。其他對(duì)象在它們之上構(gòu)建的。矩陣是繼承自Numpy數(shù)組對(duì)象的二維數(shù)組對(duì)象。矩陣也是二維的
使用mat、matrix、bmat函數(shù)構(gòu)建矩陣和矩陣的操作
mat1 = np.mat("1 2 3;2 3 4;3 4 5")
print("使用mat創(chuàng)建的矩陣:",mat1)
mat2 = np.matrix([[1,2,3],[2,3,4],[3,4,5]])
print("使用matrix創(chuàng)建的矩陣:",mat2)
mat3 = np.bmat("mat1;mat2")
print("使用bmat創(chuàng)建的矩陣:",mat3)
mat4 = mat1*3
print("矩陣與數(shù)相乘:",mat4)
mat5 = mat1+mat2
print("矩陣相加結(jié)果:",mat5)
mat6 = mat2 - mat1
print("矩陣相減結(jié)果:",mat6)
mat7 = mat1 * mat2 #等價(jià)于mat1@mat2
print("矩陣與矩陣相乘:",mat7) #相當(dāng)于求內(nèi)積
mat8 = np.multiply(mat1,mat2)
print("矩陣對(duì)應(yīng)元素相乘:",mat8)
print("矩陣的轉(zhuǎn)置:",mat1.T) #相當(dāng)于mat1.T
print("矩陣的共軛轉(zhuǎn)置:",mat1.H)
print("矩陣的逆矩陣:",mat1.I)
print("矩陣的一個(gè)視圖:",mat1.A) 8.ufunc函數(shù)
ufunc函數(shù)全稱為通用函數(shù),是一種能夠?qū)?shù)組中的所有元素(逐元素)進(jìn)行操作的函數(shù)。ufunc是針對(duì)數(shù)組進(jìn)行操作的,并且都以Numpy數(shù)組作為輸出,因?yàn)椴恍枰獙?duì)數(shù)組中的每個(gè)元素進(jìn)行操作。
一元通用函數(shù):
add、fabs 逐元素計(jì)算整數(shù)、浮點(diǎn)數(shù)或復(fù)數(shù)的絕對(duì)值
sqrt:計(jì)算每個(gè)元素的平方根
square:計(jì)算每個(gè)元素的平方
exp:計(jì)算每個(gè)元素的自然指數(shù)值
log :計(jì)算對(duì)數(shù)
ceil:計(jì)算每個(gè)元素的最高整數(shù)值? (大于等于這個(gè)數(shù)的最小整數(shù))
floor :計(jì)算每個(gè)元素的最小整數(shù)值(小于等于這個(gè)數(shù)的最大整數(shù))
sign:計(jì)算每個(gè)值的符號(hào)值:1(正數(shù)) 0(0)-1(負(fù)數(shù))
二元通用函數(shù):
add(+):將對(duì)應(yīng)元素相加???
subtract(-):在第二個(gè)數(shù)組中,將第一個(gè)數(shù)組中包含的元素去掉
multiply(*) :將屬組中對(duì)應(yīng)的元素相乘 ? ? *
divide(/),floor_diveide 除或整除
power(**):將第二個(gè)數(shù)組的元素作為第一個(gè)數(shù)組對(duì)應(yīng)元素的冪次方
maximum,fmax 逐個(gè)元素計(jì)算最大值,fmax忽略NAN
minimun,fmax:逐個(gè)元素計(jì)算最小值,fmin忽略NAN
mod:按元素的求模計(jì)算(求除法的余數(shù))
1 x = np.array([1,2,3]) 2 y = np.array([4,5,6]) 3 print("數(shù)組相加的結(jié)果:",np.add(x,y)) #相當(dāng)于+ [5 7 9] 4 print("數(shù)組相減的結(jié)果:",np.subtract(x,y)) #相當(dāng)于- [-3,-3,-3] 5 print("數(shù)組相乘的結(jié)果:",np.multiply(x,y)) #相當(dāng)于* [ 4 10 18] 6 print("數(shù)組相除的結(jié)果:",np.divide(x,y)) #相當(dāng)于/ [0.25 0.4 0.5 ] 7 print("數(shù)組冪運(yùn)算結(jié)果:",np.power(x,y)) #相當(dāng)于** [ 1 32 729] 8 print("數(shù)組求最大值:",np.maximum(x,y)) #求x,y中數(shù)組元素的最大值 9 print("數(shù)組求模:",np.mod(x,y)) #相當(dāng)于%
9.ufunc函數(shù)的廣播機(jī)制
廣播是指不同形狀的數(shù)組之間執(zhí)行算術(shù)運(yùn)算的方式、當(dāng)使用ufunc函數(shù)進(jìn)行數(shù)組計(jì)算時(shí),ufunc會(huì)對(duì)兩個(gè)元素對(duì)應(yīng)元素進(jìn)行計(jì)算。進(jìn)行這種操作的前提是兩個(gè)數(shù)組的shape一樣。當(dāng)兩個(gè)數(shù)組shape不一樣時(shí),Numpy就會(huì)執(zhí)行廣播機(jī)制。需要遵循四個(gè)原則:(1)讓所有的輸入數(shù)組向其中shape最大的數(shù)組看齊,shape中不足的地方通過在前面補(bǔ)1.
(2)輸出數(shù)組的shape是輸入數(shù)組shape的各個(gè)軸上的最大值.(3)如果輸入數(shù)組的某個(gè)軸和輸出數(shù)組的對(duì)應(yīng)軸的長度相同或者長度為一,則這個(gè)數(shù)組能夠用來計(jì)算,否則出錯(cuò).
(4)當(dāng)輸入數(shù)組的某個(gè)軸長度為1時(shí),沿著此軸運(yùn)算時(shí)使用此軸上的第一組值。
1 arr1 = np.array([[0,0,0],[1,1,1],[2,2,2]]) 2 arr2 = np.array([1,2,3]) 3 print(arr1+arr2) 4 arr3 = np.array([[0,0,0],[1,1,1],[2,2,2]]) 5 arr4= np.array([1,2,3]).reshape(3,1) 6 print(arr3+arr4)
?10、利用Numpy進(jìn)行統(tǒng)計(jì)分析
1.讀、寫文件:
Numpy文件的讀/寫主要有二進(jìn)制的文件讀/寫和文件列表形式的數(shù)據(jù)讀/寫兩種形式.save函數(shù)主要以二進(jìn)制的格式保存數(shù)據(jù),load函數(shù)從二進(jìn)制的文件中讀取數(shù)據(jù)
基本語法:np.save(file,arr,allow_pickle=True,fix_imports=Trues) file為文件名稱,arr表示需要保存的數(shù)據(jù),如果需要保存多個(gè)數(shù)組至一個(gè)文件中,可以使用savez函數(shù)
data = np.load(file) ? 從二進(jìn)制文件中獲取數(shù)據(jù)
np.savetxt(file,X,delimeter=' ,')需要保存數(shù)據(jù)至文本中,file表示文件名,X表示保存的數(shù)據(jù),delimeter表示分隔符。
np.loadtxt(file)? 從文本中獲取數(shù)據(jù)
2.簡單的統(tǒng)計(jì)分析
1 import numpy as np 2 arr1 = np.array([1,3,4,8,6]) 3 np.sort(arr1) #對(duì)arr1進(jìn)行排序 4 arr2= np.random.randint(1,9,(3,3)) 5 arr2.sort(axis=1) #對(duì)arr2列向排列 6 print(arr2) 7 arr2.sort(axis=0) #對(duì)arr2進(jìn)行橫向排列 8 arr3 = np.array([1,1,2,5,3,6,4,6,6,8]) 9 print(np.unique(arr3)) #相當(dāng)于 np.sort(set(arr3)) ,對(duì)arr3進(jìn)行去重并排序 10 print(np.tile(arr1,3)) #對(duì)整個(gè)arr1數(shù)組進(jìn)行復(fù)制,3 代表3次 11 print(np.repeat(arr1,2,axis=0)) #對(duì)arr1中的元素進(jìn)行橫向復(fù)制2次 12 print(np.repeat(arr1,2,axis=1)) #對(duì)arr1中元素進(jìn)行列向復(fù)制2次 13 print("arr1數(shù)組的和:",np.sum(arr1)) #計(jì)算數(shù)組的和 14 print("arr2數(shù)組列向的和",np.sum(arr2,axis=0)) #計(jì)算arr2列向的和 15 print("arr2數(shù)組橫向的和",np.sum(arr2,axis=1)) #計(jì)算arr1橫向的和 16 print("arr1數(shù)組的平均值:",np.mean(arr1)) #計(jì)算數(shù)組的平均值 17 print("arr2數(shù)組的縱向的平均值",np.mean(arr2,axis=0)) #計(jì)算列向的平均值 18 print("arr2數(shù)組的橫向平均值:",np.mean(arr2,axis=1)) #計(jì)算橫向的平均值 19 print("方差:",np.var(arr1)) #計(jì)算arr1的方差 20 print("標(biāo)準(zhǔn)差:",np.std(arr1)) #計(jì)算arr1的標(biāo)準(zhǔn)差 21 print("數(shù)組的最大值",np.max(arr1)) #計(jì)算arr1的最大值 22 print("數(shù)組的最小值:",np.min(arr1)) #計(jì)算arr1的最小值 23 print("最大值的索引:",arr1) #返回最大值的索引 24 print("最小值的索引:",arr1) #返回最小值的索引 25 print("累計(jì)求和:",np.cumsum(arr1)) #累計(jì)求和 26 print('累積:',np.cumprod(arr1)) #累乘View Code
11線性代數(shù)
1 import numpy as np 2 arr1 = np.array([[1,2,3],[2,3,4]]) 3 arr2 = np.array([[1,2],[2,3],[3,4]]) 4 print(arr1@arr2) #點(diǎn)乘積 5 print(np.dot(arr1,arr2)) #點(diǎn)乘積 6 print(arr1*arr1)#逐元素乘積 7 arr3 = np.array([[1,2,3],[2,3,4],[5,6,7]]) 8 print(np.linalg.inv(arr3)) #inv 求逆矩陣 9 print(np.diag(arr3)) #將方陣的對(duì)角線元素以一元數(shù)組的形式返回 10 print(np.trace(arr3)) #計(jì)算對(duì)角線元素的和 11 print(np.linalg.det(arr3)) #計(jì)算矩陣的行列式 12 x,y = np.linalg.eig(arr3) #計(jì)算方針的特征值和特征矩陣 13 print(x) #x 特征值,y特征向量 14 print(np.linalg.qr(arr3)) #計(jì)算qr分解 15 print(np.linalg.svd(arr3)) #計(jì)算svd分解 16 #np.linalg.solve(a,b) #求解方程 17 # np.linalg.lstsq(a,b) #計(jì)算最小二乘View Code
?
轉(zhuǎn)載于:https://www.cnblogs.com/Ezhizen/p/10274621.html
總結(jié)
以上是生活随笔為你收集整理的我的Python分析成长之路8的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 金圣多少钱啊?
- 下一篇: module.exports 和 exp