我的Python分析成長之路8

  • 2020 年 1 月 23 日
  • 筆記

Numpy數值計算基礎

Numpy:是Numerical Python的簡稱,它是目前Python數值計算中最為基礎的工具包,Numpy是用於數值科學計算的基礎模組,不但能夠完成科學計算的任而且能夠用作高效的多維數據容器,可用於存儲和處理大型矩陣。Numpy的數據容器能夠保存任意類型的數據,這使得Numpy可以無縫並快速地整合各種數據。Numpy本身並沒有提供很多高效的數據分析功能。理解Numpy數組即數組計算有利於更加高效地使用其他如pandas等數據分析工具。

Numpy提供了兩種基本的對象:ndarray(多維數組對象)和ufunc(通用函數)

1.數組屬性:

ndim:返回int 。數組的維度

      shape:返回tuple。表示數組的尺寸,對於n行m列的矩陣,形狀為(m,n)

      size:返回int。表示數組的元素整數,等於數組形狀的乘積

      dtype:返回data-typle。描述數組中元素的類型

      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.數組創建

一、生成多維數組最簡單的方式就是使用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))   #生成二維數組

二、使用其他函數創建數組

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:]) #第二、三行,第二、三列  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)

10、利用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))  #累乘

View Code

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)  #計算最小二乘

View Code