Numpy數值計算基礎數組
Numpy:是Numerical Python的簡稱,它是目前Python數值計算中最爲基礎的工具包,Numpy是用於數值科學計算的基礎模塊,不但可以完成科學計算的任並且可以用做高效的多維數據容器,可用於存儲和處理大型矩陣。Numpy的數據容器可以保存任意類型的數據,這使得Numpy能夠無縫並快速地整合各類數據。Numpy自己並無提供不少高效的數據分析功能。理解Numpy數組即數組計算有利於更加高效地使用其餘如pandas等數據分析工具。dom
Numpy提供了兩種基本的對象:ndarray(多維數組對象)和ufunc(通用函數)ide
1.數組屬性:函數
ndim:返回int 。數組的維度工具
shape:返回tuple。表示數組的尺寸,對於n行m列的矩陣,形狀爲(m,n)spa
size:返回int。表示數組的元素整數,等於數組形狀的乘積code
dtype:返回data-typle。描述數組中元素的類型orm
itemsize:返回int。表示數組中每一個元素的大小(以字節爲單位)對象
1 import numpy as np 2 arr1 = np.arange(9).reshape(3,3) 3 print("建立數組:",arr1) 4 print("數組的維度:",arr1.ndim) 5 print("數組的尺寸(形狀):",arr1.shape) 6 print("數組的數據類型:",arr1.dtype) 7 print("數據元素個數:",arr1.size) 8 print("數據每一個元素大小:",arr1.itemsize)
2.數組建立blog
1、生成多維數組最簡單的方式就是使用array函數,array函數接受任意的序列型對象(固然也包括其餘的數組)。
基本語法法:numpy.array(object,dtype=None,copy=True,order='K',subok=False,ndmin=0)
1.object 接受array。表示想要建立的數組.無默認
2.dtype 接受data-type.表示數組所需的數據類型。默認爲None
3.ndmin 接受int。指定數組的最小維度。默認爲None
import numpy as np data1 = [1,2,3,4,5] data2 = [[1,2,3,4],[5,6,7,8]] print("生成一維數組:",np.array(data1)) #生成一維數組 print("生成二維數組:",np.array(data2)) #生成二維數組
2、使用其餘函數建立數組
1 import numpy as np 2 print("使用arange函數生成數組:",np.arange(0,10,1)) #左閉右開 3 print("使用linspace函數生成數組:",np.linspace(0,9,10)) #閉區間 4 print("使用logspace函數生成數組:",np.logspace(0,2,10)) #[1,100]生成10個數 5 print("使用zeros函數生成數組:",np.zeros((2,3))) #生成二行三列全爲0的數組 6 print("使用ones函數生成數組:",np.ones((2,3))) #生成二行三列全爲一的數組 7 print("使用eye函數生成數組:",np.ones(3)) #生成對角線上爲一的數組 8 print("使用diag函數生成數組:",np.diag([1,2,3,4]))
3.數組的數據類型
在Numpy中,所欲數組的數據類型是同質的,即數組中的全部元素必須是一致的。這樣作的好處,更容易肯定數組所須要的存儲空間。
bool :用一位存儲的布爾類型(True or False)
inti:由所在平臺決定其精度的整數
int8:整數 範圍爲:-128~127
int16:整數 範圍爲:-32768~32767
int32:整數 範圍爲:-2^31~2^32-1
int64:整數 範圍爲:-2^63~2^63-1
unit8:無符號整數 範圍爲:0~255
unit16:無符號整數 範圍爲:0~65535
unit32:無符號整數 範圍爲0~2^32-1
unit64 無符號整數 範圍爲0~2^64-1
float16:半精度浮點數
float32:單精度浮點數
float64: 雙精度浮點數
complex64 複數 分別用32爲浮點數表明實部和虛部
complex128/comple 複數分別用64位浮點數表示實部和虛部
np.dtype() 查看數據類型
print(np.float(32)) #整形轉化爲浮點型 print(np.int(42.0)) #浮點型轉化爲整形 print(np.bool(42)) #整形轉化爲bool型 print(np.float(True)) #bool型轉化爲浮點型
4.生成隨機數
Numpy提供了強大的生成隨機數的功能,但使用的都是僞隨機數.random 是最多見的生成隨機數的方法.
1 print("生成隨機數:",np.random.random()) 2 print("生成均勻分佈的隨機數",np.random.rand(10,5)) 3 print("生成正態分佈的隨機數",np.random.randn(10,5)) 4 print("生成給定上下限的隨機數:",np.random.randint(0,10,size=[5,2])) 5 print("生成二項分佈隨機數:",np.random.binomial(10,0,(2,3))) 6 print("生成beta分佈隨機數:",np.random.beta(0.2,0.3,(2,3))) 7 print("生成卡方分佈隨機數:",np.random.chisquare(10,[5,2])) 8 print("生成gamma分佈隨機數:",np.random.gamma(10,1,(5,2))) 9 print("生成任意期間均勻分佈隨機數:",np.random.uniform(0,10,(5,2)))
5.經過索引訪問數組
1.一維數組的索引
一維數組的索引比較簡單,與Python中list的索引方法相似:若是你傳遞一個數值給數組的切片,數值會被傳遞給整個切片。區別於Python的內建列表,數組的切片是原數組的視圖。這意味着數據並非被複制,任何對於視圖的修改都會反映到原數組上。
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() #若是不想要得到是一份視圖的話,就用顯示的複製這個數組 .copy() 7 print(arr1)
2.多維數組的索引
多維數組的每個維度都有一個索引,各個維度的索引之間用逗號隔開,或分兩個括號
1 arr= np.arange(9).reshape(3,3) 2 print(arr[0][2]) #2 3 print(arr[0,2]) #2 這兩種方式訪問等價 4 print(arr[1:,1:]) #第2、三行,第2、三列 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']) #在索引數組中引入布爾數組 選擇names=="B"的行 5 print(data[names=='B',2:]) #names ="B" 的後兩列
6.改變數組的形態
在對數組進行操做時,常常須要改變數組的維度。在Numpy中,經常使用reshape函數改變數組的「形狀」,也就是改變數組的維度。參數爲一個正整數元組,分別指定數組在每一個維度上的大小,reshape函數在改變原始數據形狀的同時不改變原始數據。若是指定的數據和數組的元素不吻合,則函數將拋出異常。
使用ravel()、flatten()完成展開工做,使用hstack()、vstack() 、concatenate完成組合操做,使用hsplit、vsplit、dsplit、split完成分割操做,能夠將數組分割成相同大小的子數組,也能夠指定原數組中須要分割的位置。
1 arr = np.arange(12) 2 print("建立一維數組:",arr) 3 print("新的數組:",arr.reshape(3,4)) #返回(3,4)的數組 4 print("數組的維度:",arr.ndim) #查看數組的維度 2 5 arr2 = np.arange(12).reshape(3,4) 6 print("建立的二維數組:",arr2) 7 print("使用ravel展平:",arr2.ravel()) #得到一維數組[ 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.建立numpy矩陣
在Numpy中,矩陣是ndarray的子類,在Numpy中,數組和矩陣有着重要的區別.Numpy中提供了兩個基本的對象:一個N維數組對象和一個通用函數對象。其餘對象在它們之上構建的。矩陣是繼承自Numpy數組對象的二維數組對象。矩陣也是二維的
使用mat、matrix、bmat函數構建矩陣和矩陣的操做
mat1 = np.mat("1 2 3;2 3 4;3 4 5")
print("使用mat建立的矩陣:",mat1)
mat2 = np.matrix([[1,2,3],[2,3,4],[3,4,5]])
print("使用matrix建立的矩陣:",mat2)
mat3 = np.bmat("mat1;mat2")
print("使用bmat建立的矩陣:",mat3)
mat4 = mat1*3
print("矩陣與數相乘:",mat4)
mat5 = mat1+mat2
print("矩陣相加結果:",mat5)
mat6 = mat2 - mat1
print("矩陣相減結果:",mat6)
mat7 = mat1 * mat2 #等價於mat1@mat2
print("矩陣與矩陣相乘:",mat7) #至關於求內積
mat8 = np.multiply(mat1,mat2)
print("矩陣對應元素相乘:",mat8)
print("矩陣的轉置:",mat1.T) #至關於mat1.T
print("矩陣的共軛轉置:",mat1.H)
print("矩陣的逆矩陣:",mat1.I)
print("矩陣的一個視圖:",mat1.A)
8.ufunc函數
ufunc函數全稱爲通用函數,是一種可以對數組中的全部元素(逐元素)進行操做的函數。ufunc是針對數組進行操做的,而且都以Numpy數組做爲輸出,由於不須要對數組中的每一個元素進行操做。
一元通用函數:
add、fabs 逐元素計算整數、浮點數或複數的絕對值
sqrt:計算每一個元素的平方根
square:計算每一個元素的平方
exp:計算每一個元素的天然指數值
log :計算對數
ceil:計算每一個元素的最高整數值 (大於等於這個數的最小整數)
floor :計算每一個元素的最小整數值(小於等於這個數的最大整數)
sign:計算每一個值的符號值:1(正數) 0(0)-1(負數)
二元通用函數:
add(+):將對應元素相加
subtract(-):在第二個數組中,將第一個數組中包含的元素去掉
multiply(*) :將屬組中對應的元素相乘 *
divide(/),floor_diveide 除或整除
power(**):將第二個數組的元素做爲第一個數組對應元素的冪次方
maximum,fmax 逐個元素計算最大值,fmax忽略NAN
minimun,fmax:逐個元素計算最小值,fmin忽略NAN
mod:按元素的求模計算(求除法的餘數)
1 x = np.array([1,2,3]) 2 y = np.array([4,5,6]) 3 print("數組相加的結果:",np.add(x,y)) #至關於+ [5 7 9] 4 print("數組相減的結果:",np.subtract(x,y)) #至關於- [-3,-3,-3] 5 print("數組相乘的結果:",np.multiply(x,y)) #至關於* [ 4 10 18] 6 print("數組相除的結果:",np.divide(x,y)) #至關於/ [0.25 0.4 0.5 ] 7 print("數組冪運算結果:",np.power(x,y)) #至關於** [ 1 32 729] 8 print("數組求最大值:",np.maximum(x,y)) #求x,y中數組元素的最大值 9 print("數組求模:",np.mod(x,y)) #至關於%
9.ufunc函數的廣播機制
廣播是指不一樣形狀的數組之間執行算術運算的方式、當使用ufunc函數進行數組計算時,ufunc會對兩個元素對應元素進行計算。進行這種操做的前提是兩個數組的shape同樣。當兩個數組shape不同時,Numpy就會執行廣播機制。須要遵循四個原則:(1)讓全部的輸入數組向其中shape最大的數組看齊,shape中不足的地方經過在前面補1.
(2)輸出數組的shape是輸入數組shape的各個軸上的最大值.(3)若是輸入數組的某個軸和輸出數組的對應軸的長度相同或者長度爲一,則這個數組可以用來計算,不然出錯.
(4)當輸入數組的某個軸長度爲1時,沿着此軸運算時使用此軸上的第一組值。
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)
十、利用Numpy進行統計分析
1.讀、寫文件:
Numpy文件的讀/寫主要有二進制的文件讀/寫和文件列表形式的數據讀/寫兩種形式.save函數主要以二進制的格式保存數據,load函數從二進制的文件中讀取數據
基本語法:np.save(file,arr,allow_pickle=True,fix_imports=Trues) file爲文件名稱,arr表示須要保存的數據,若是須要保存多個數組至一個文件中,可使用savez函數
data = np.load(file) 從二進制文件中獲取數據
np.savetxt(file,X,delimeter=' ,')須要保存數據至文本中,file表示文件名,X表示保存的數據,delimeter表示分隔符。
np.loadtxt(file) 從文本中獲取數據
2.簡單的統計分析
1 import numpy as np 2 arr1 = np.array([1,3,4,8,6]) 3 np.sort(arr1) #對arr1進行排序 4 arr2= np.random.randint(1,9,(3,3)) 5 arr2.sort(axis=1) #對arr2列向排列 6 print(arr2) 7 arr2.sort(axis=0) #對arr2進行橫向排列 8 arr3 = np.array([1,1,2,5,3,6,4,6,6,8]) 9 print(np.unique(arr3)) #至關於 np.sort(set(arr3)) ,對arr3進行去重並排序 10 print(np.tile(arr1,3)) #對整個arr1數組進行復制,3 表明3次 11 print(np.repeat(arr1,2,axis=0)) #對arr1中的元素進行橫向複製2次 12 print(np.repeat(arr1,2,axis=1)) #對arr1中元素進行列向複製2次 13 print("arr1數組的和:",np.sum(arr1)) #計算數組的和 14 print("arr2數組列向的和",np.sum(arr2,axis=0)) #計算arr2列向的和 15 print("arr2數組橫向的和",np.sum(arr2,axis=1)) #計算arr1橫向的和 16 print("arr1數組的平均值:",np.mean(arr1)) #計算數組的平均值 17 print("arr2數組的縱向的平均值",np.mean(arr2,axis=0)) #計算列向的平均值 18 print("arr2數組的橫向平均值:",np.mean(arr2,axis=1)) #計算橫向的平均值 19 print("方差:",np.var(arr1)) #計算arr1的方差 20 print("標準差:",np.std(arr1)) #計算arr1的標準差 21 print("數組的最大值",np.max(arr1)) #計算arr1的最大值 22 print("數組的最小值:",np.min(arr1)) #計算arr1的最小值 23 print("最大值的索引:",arr1) #返回最大值的索引 24 print("最小值的索引:",arr1) #返回最小值的索引 25 print("累計求和:",np.cumsum(arr1)) #累計求和 26 print('累積:',np.cumprod(arr1)) #累乘
11線性代數
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) #點乘積 5 print(np.dot(arr1,arr2)) #點乘積 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)) #將方陣的對角線元素以一元數組的形式返回 10 print(np.trace(arr3)) #計算對角線元素的和 11 print(np.linalg.det(arr3)) #計算矩陣的行列式 12 x,y = np.linalg.eig(arr3) #計算方針的特徵值和特徵矩陣 13 print(x) #x 特徵值,y特徵向量 14 print(np.linalg.qr(arr3)) #計算qr分解 15 print(np.linalg.svd(arr3)) #計算svd分解 16 #np.linalg.solve(a,b) #求解方程 17 # np.linalg.lstsq(a,b) #計算最小二乘