《Python程序設計》課件11-Numpy數值計算_第1頁
《Python程序設計》課件11-Numpy數值計算_第2頁
《Python程序設計》課件11-Numpy數值計算_第3頁
《Python程序設計》課件11-Numpy數值計算_第4頁
《Python程序設計》課件11-Numpy數值計算_第5頁
已閱讀5頁,還剩25頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

~1~第十一章Numpy數值計算目錄Numpy概述NumPy基礎數組運算邏輯運算與條件篩選排序、搜索與計數Numpy的向量化案例:線性回歸分析-2-1.Numpy概述數值計算:在現代科學和工程計算中,處理大規模數據和執行復雜的數值計算已成為常態。Python作為一種高效、易學的編程語言,其在數據科學領域的廣泛應用部分歸功于NumPy庫Numpy的主要功能:NumPy(NumericalPython):Python編程語言的一個核心庫,專為處理大規模的數值數據而設計,其主要功能包括:多維數組對象(ndarray):提供對多維數組的高效操作。數值計算的高性能函數:支持快速的數學運算,包括線性代數、傅里葉變換等。強大的廣播機制:允許對不同形狀的數組進行靈活的運算。NumPy的優勢體現在:高效的數值計算:NumPy的核心是其多維數組對象,提供了快速、靈活的數組操作,這在處理大型數據集時尤為重要。Python科學計算的基礎:NumPy是許多其他科學計算庫(如SciPy、Pandas、Matplotlib、TensorFlow等)的基礎,這些庫廣泛用于數據分析、機器學習和人工智能領域。跨語言性能優勢:NumPy在底層使用C和Fortran編寫,以確保性能接近于純C或Fortran程序,同時保留了Python的靈活性和易用性。32.NumPy基礎2.1NumPy的安裝與配置在開始使用NumPy之前,需要先進行安裝和配置。NumPy可以通過Python包管理工具pip進行安裝。要使用pip安裝NumPy,打開命令行或終端,輸入以下命令:pipinstallnumpy安裝NumPy后,通過Python解釋器導入NumPy來驗證安裝是否成功:importnumpyasnpprint(np.__version__)執行上述代碼,如果輸出了NumPy的版本號,則表示安裝成功。42.2ndarray對象ndarray(N-dimensionalarray):是NumPy的核心數據結構,支持多維數組和矩陣運算。與Python的列表list相比,ndarray具有更高的性能和更豐富的功能。創建ndarray有兩種方法。方法一:從Python列表或元組創建:NumPy可將Python的列表或元組轉換為ndarray對象:importnumpyasnp#從列表創建一維數組array_1d=np.array([1,2,3,4,5])print(array_1d)#從嵌套列表創建二維數組array_2d=np.array([[1,2,3],[4,5,6]])print(array_2d)5方法二:使用NumPy內置函數:NumPy提供了多種內置函數用于創建特定類型的數組。(1)np.zeros(shape):創建全零數組。zeros_array=np.zeros((3,3))print(zeros_array)(2)np.ones(shape):創建全一數組。ones_array=np.ones((2,4))print(ones_array)(3)np.eye(N):創建N×N的單位矩陣。eye_array=np.eye(4)print(eye_array)(4)np.arange(start,stop,step):用于創建一個等差數列的數組,從start開始(包含)到stop結束(不包含),以step為步長。arange_array=np.arange(0,10,2)print(arange_array)(5)np.linspace(start,stop,num):用于創建一個等間隔數列的數組,從start開始到stop結束(包含),生成的數組具有num個元素。linspace方法名稱來源于linearspace(線性空間)的縮寫。linspace_array=np.linspace(0,1,5)print(linspace_array)62.3ndarray的屬性和方法NumPy數組對象具有豐富的屬性和方法,用于獲取數組的基本信息和執行常見操作:ndarray的屬性ndarray.shape:數組的形狀ndarray.size:數組的元素總數ndarray.dtype:數組元素的數據類型ndarray.ndim:數組的維數array=np.array([[1,2,3],[4,5,6]])print(array.shape)#輸出:(2,3)print(array.size)#輸出:6print(array.dtype)#輸出:int64(根據系統不同,可能不同)print(array.ndim)#輸出:27ndarray的方法ndarray.reshape(shape):改變數組形狀,將一個數組的形狀從一個維度變換為另一個維度,其中shape用一個整數元組表示。該方法是按照元素的行優先順序(即按行主序,也叫C-order)來重新排列數組的形狀。這意味著元素在內存中的存儲順序不會改變,而是將這些元素按照新的形狀進行重新解釋。array=np.array([[1,2,3],[4,5,6]])reshaped_array=array.reshape((3,2))print(reshaped_array)ndarray.flatten():將多維數組展開為一維。flattened_array=array.flatten()print(flattened_array)ndarray.transpose():轉置數組。transposed_array=array.transpose()print(transposed_array)ndarray.astype(dtype):轉換數組的數據類型,返回一個新數組,數組的數據類型為指定的類型,其中dtype參數指定要轉換成的數據類型。float_array=array.astype(float)print(float_array)82.4數組的索引和切片NumPy支持豐富的索引和切片操作,允許對數組進行靈活的訪問和修改。(1)基本索引:使用整數索引訪問和修改數組中的單個元素。array=np.array([10,20,30,40,50])print(array[0])#輸出:10array[1]=25print(array)#輸出:[1025304050](2)切片操作:使用切片訪問數組的子集,語法類似于Python的list,但在NumPy中切片返回的是視圖(view)而非副本,這意味著對切片的修改會直接影響原數組。NumPy支持多維切片,允許在每個維度上進行靈活的切片操作。array=np.array([10,20,30,40,50])sub_array=array[1:4]print(sub_array)#輸出:[203040]#二維數組切片array_2d=np.array([[1,2,3],[4,5,6],[7,8,9]])sub_array_2d=array_2d[:2,1:]print(sub_array_2d)#輸出:[[23][56]]9(3)布爾索引:根據條件表達式直接從數組中提取滿足特定條件的元素。具體來說,布爾索引是利用布爾數組對原數組進行索引的一種方法。布爾數組與原數組形狀相同,其中的布爾值(True或False)用于指示是否選擇對應位置的元素。當布爾值為True時,選擇該位置的元素;否則,忽略該元素。importnumpyasnparr=np.array([1,2,3,4,5])#創建一個布爾索引條件,生成布爾數組bool_index=arr>3print(bool_index)可以使用布爾索引從數組中選擇元素。#使用布爾索引從數組中選擇元素filtered_arr=arr[bool_index]print(filtered_arr)在上例中,布爾索引條件是通過布爾條件表達式來生成布爾數組,用于篩選原數組中滿足特定條件的元素。這個布爾條件表達式可以是任何返回布爾值的比較操作,比如等于(==)、大于(>)、以及組合多個條件的邏輯操作符(&,|,~))等。例如,布爾表達式arr>3會遍歷arr數組的每個元素,并對每個元素返回相應的布爾值True或False,這與map()函數對每個元素應用一個函數非常相似。10運行結果:[FalseFalseFalseTrueTrue]運行結果:[45]3.數組運算NumPy提供了豐富的數組運算功能,支持各種數學運算、統計分析和線性代數計算(1)基本數學運算NumPy中的數組運算允許用戶在數組間執行各種數學操作,而無需顯式編寫循環。這些運算支持標量與數組間的運算以及數組間的元素級運算。(1)標量與數組運算:NumPy支持對數組中的每個元素執行標量運算。例如,數組可以與標量相加、相減、相乘或相除,這些運算將應用于數組的每個元素。importnumpyasnp

#創建一個數組array=np.array([1,2,3,4])

#標量加法result_add=array+10print(result_add)#輸出:[11121314]

#標量乘法result_mul=array*2print(result_mul)#輸出:[2468]113.數組運算(2)數組間運算:對于數組間的運算,NumPy支持逐元素的加、減、乘、除。這要求參與運算的兩個數組具有相同的形狀。array1=np.array([1,2,3])array2=np.array([4,5,6])

#數組加法result_sum=array1+array2print(result_sum)#輸出:[579]

#數組乘法result_prod=array1*array2print(result_prod)#輸出:[41018]12(3)廣播機制:允許不同形狀的數組之間執行運算,前提是它們的形狀在某些維度上兼容。廣播機制會自動擴展較小的數組,使其與較大的數組匹配。array=np.array([[1,2,3],[4,5,6]])scalar=10

#廣播機制將標量擴展為數組形狀result_broadcast=array+scalarprint(result_broadcast)如果兩個數組的形狀在最后幾維相同,或者其中一個數組的維度為1,則可以執行廣播。array1=np.array([[1,2,3],[4,5,6]])#形狀(2,3)array2=np.array([10,20,30])#形狀(1,3)

result_broadcast=array1+array2print(result_broadcast)上例中,array1的形狀是(2,3),而array2的形狀是(1,3)。由于它們的形狀在最后一維相同,且array2的第一維是1,根據廣播規則,array2可以在計算時沿第一個維度自動擴展,變成形狀(2,3),即[[10,20,30],[10,20,30]],從而與array1相加得到結果。13[[111213][141516]][[112233][142536]](2)統計函數:NumPy提供了多種統計函數,用于分析數組數據的分布特征。這些函數可以用于計算數組的均值、標準差、方差、最大值、最小值等。1)均值、標準差、方差均值(mean):數組元素的平均值。array=np.array([1,2,3,4,5])mean_value=np.mean(array)print(mean_value)#輸出:3.0標準差(standarddeviation):描述數據的離散程度。std_deviation=np.std(array)print(std_deviation)#輸出:1.4142135623730951方差(variance):標準差的平方,表示數據分布的離散程度。variance_value=np.var(array)print(variance_value)#輸出:2.014這些函數可以通過指定axis參數來沿數組的特定軸進行計算。在NumPy中,axis參數用于指定數組操作的方向,它決定了在哪個方向上壓縮數組。以二維數組為例:axis=0:沿著列的方向(垂直方向)進行操作,跨行進行運算,對于axis=0,操作會在每一列上進行,這意味著結果是對每一列的值進行聚合。axis=1:沿著行的方向(水平方向)進行操作,跨列進行運算。對于axis=1,操作會在每一行上進行,這意味著結果是對每一行的值進行聚合。array_2d=np.array([[1,2,3],[4,5,6]])#沿列計算均值mean_along_axis0=np.mean(array_2d,axis=0)print(mean_along_axis0)#輸出:[2.53.54.5]#沿行計算標準差std_along_axis1=np.std(array_2d,axis=1)print(std_along_axis1)#輸出:[0.816496580.81649658]2)最大值、最小值最大值(max):數組中的最大元素。max_value=np.max(array)print(max_value)#輸出:5最小值(min):數組中的最小元素。min_value=np.min(array)print(min_value)#輸出:1同樣,axis參數可以用于在特定軸上計算最大值和最小值:#沿列計算最大值max_along_axis0=np.max(array_2d,axis=0)print(max_along_axis0)#輸出:[456]#沿行計算最小值min_along_axis1=np.min(array_2d,axis=1)print(min_along_axis1)#輸出:[14]15(3)線性代數運算:(1)矩陣乘法:使用np.dot()函數或@運算符進行矩陣乘法matrix1=np.array([[1,2],[3,4]])matrix2=np.array([[5,6],[7,8]])#矩陣乘法product=np.dot(matrix1,matrix2)#product=matrix1@matrix2#同理print(product)運行結果:[[1922][4350]]16(2)逆矩陣與特征值:矩陣A的逆矩陣是一個矩陣B,使得AB=I(單位矩陣),計算逆矩陣需要確保矩陣是方陣且可逆。NumPy庫中numpy.linalg模塊提供的函數inv()用于計算矩陣的逆矩陣。fromnumpy.linalgimportinv

matrix=np.array([[1,2],[3,4]])inverse_matrix=inv(matrix)print(inverse_matrix)運行結果:[[-2.1.][1.5-0.5]](3)特征值與特征向量:特征值是線性變換不變的標量值,特征向量是在變換下保持方向不變的向量。使用np.linalg.eig()計算特征值和特征向量。fromnumpy.linalgimporteig

matrix=np.array([[1,2],[2,1]])eigenvalues,eigenvectors=eig(matrix)print("特征值:",eigenvalues)print("特征向量:\n",eigenvectors)運行結果:特征值:[3.-1.]特征向量:[[0.70710678-0.70710678][0.707106780.70710678]]174.邏輯運算與條件篩選NumPy支持靈活的邏輯運算與條件篩選功能,允許用戶基于條件高效地過濾和操作數組數據。(1)布爾數組:是由布爾值(True或False)組成的數組,用于邏輯運算和條件篩選。布爾數組通常由比較操作生成,#創建一個數組array=np.array([1,2,3,4,5])

#生成布爾數組bool_array=array>3print(bool_array)#輸出:[FalseFalseFalseTrueTrue]布爾數組可以用于數組的元素級邏輯運算array1=np.array([True,False,True])array2=np.array([False,False,True])

#布爾與result_and=np.logical_and(array1,array2)print(result_and)#輸出:[FalseFalseTrue]

#布爾或result_or=np.logical_or(array1,array2)print(result_or)#輸出:[TrueFalseTrue]18(2)條件索引與過濾:使用布爾數組對數組進行條件索引和過濾,從數組中提取滿足特定條件的元素。array=np.array([10,20,30,40,50])

#使用布爾索引過濾數組元素filtered_array=array[array>30]print(filtered_array)#輸出:[4050]在此例中,array>30會返回一個布爾數組[False,False,False,True,True],表示每個元素是否大于30。使用array[array>30],利用布爾索引的方法只提取布爾數組中值為True的位置對應的元素。條件篩選也可以結合其他操作進行更復雜的數據處理。array=np.array([[1,2,3],[4,5,6]])#使用條件篩選替換數組中的特定值array[array%2==0]=0print(array)運行結果:[[103][050]]5.排序、搜索與計數NumPy提供了一系列函數用于對數組進行排序、搜索和計數操作,高效組織和分析數據。(1)數組排序:NumPy的sort()函數用于對數組進行排序,返回排序后的數組:array=np.array([3,1,2,5,4])

#對數組進行排序sorted_array=np.sort(array)print(sorted_array)#輸出:[12345]NumPy也支持對多維數組的特定軸進行排序:array_2d=np.array([[10,1,8],[9,5,6]])

#沿列排序sorted_array_along_axis0=np.sort(array_2d,axis=0)print(sorted_array_along_axis0)運行結果:[[916][1058]]19(2)唯一值與去重:NumPy提供unique()函數用于查找數組中的唯一值,并去除重復項。array=np.array([1,2,2,3,3,3,4])

#查找唯一值unique_values=np.unique(array)print(unique_values)#輸出:[1234]6.Numpy的向量化向量化是NumPy的一個核心特性,通過批量操作替代逐元素的標量運算或循環處理,以顯著提升性能、減少代碼復雜性,并充分利用底層硬件(如SIMD指令、并行計算等)20(2)逐元素操作的批量化將標量的逐元素運算擴展為數組的批量操作,例如算術運算、數學函數等。#標量方式x=2result=x**2

#向量化方式arr=np.array([1,2,3,4])result=arr**2#[1,4,9,16](1)消除顯式循環避免Python層面的for循環,減少解釋器的開銷。通過NumPy的批量操作,直接對數組整體進行計算。importnumpyasnp

#循環方式lst=[1,2,3,4,5]result=[x*2forxinlst]

#向量化方式arr=np.array(lst)result=arr*2#[2,4,6,8,10](3)內置數學函數NumPy提供的數學函數(如sin、cos、sqrt)可以直接應用于數組,這些函數本身是向量化的。arr=np.array([0,np.pi/2,np.pi])result=np.sin(arr)#[0.0,1.0,0.0](4)簡化復雜運算邏輯通過廣播、內置函數和高級索引,將復雜的多步驟操作合并為單步或少量操作。#循環方式arr=[1,2,3,4]result=sum([x**2forxinarr])

#向量化方式arr=np.array([1,2,3,4])result=np.sum(arr**2)#更高效217.案例:線性回歸分析線性回歸:在數據科學中,線性回歸是一種常用的預測模型,通過擬合一個線性方程來描述自變量和因變量之間的線性關系。例:使用線性回歸模型分析并預測GDP使用線性回歸模型來對模擬的GDP數據進行分析,并預測未來兩年的GDP。整個過程包括數據準備、年度增長率計算、回歸模型訓練和未來數據的預測。22(1)導入庫并模擬GDP數據首先導入NumPy庫,并模擬一組GDP時間序列數據作為輸入。importnumpyasnp#模擬GDP時間序列數據(單位:萬億美元)gdp_data=np.array([18.57,18.71,18.83,18.96,19.08,19.21,19.33,19.45,19.57,19.70])(2)計算年度增長率年度增長率用于衡量經濟增長情況。計算方法為相鄰年份的GDP差值除以前一年的GDP。#計算GDP的年度增長率gdp_growth_rate=np.diff(gdp_data)/gdp_data[:-1]*100print("GDP年度增長率:",gdp_growth_rate)np.diff()方法用于計算數組中相鄰元素的差值。它會返回一個新數組,其中的每個元素是原數組中相鄰元素的差值。在此例中,np.diff(gdp_data)計算了GDP數據中相鄰年份之間的差值,用以衡量年度GDP的變化。23(3)準備回歸模型的數據線性回歸模型通過擬合直線方程,描述自變量與因變量之間的關系。這里將年份數據作為自變量(X),GDP數據作為因變量(y)。為了進行回歸分析,還需要為自變量增加偏置項(截距),以便模型可以更好地擬合。#準備回歸模型的數據,X為自變量(年份),y為因變量(GDP)X=np.arange(len(gdp_data)).reshape(-1,1)y=gdp_data#增加偏置項(截距)X_b=np.c_[np.ones((X.shape[0],1)),X]X使用np.arange()函數生成表示年份的數據,并通過reshape(-1,1)轉換為列向量,表示10年的數據序列。y為前面創建的gdp_data,表示GDP的實際數值。然后通過np.ones()生成一個全是1的列向量,用作偏置項,并與X拼接在一起,生成包含偏置項的特征矩陣X_b,以確保模型中包含截距項。np.c_[]是NumPy提供的一種方便的拼接操作,可以將多個數組沿著列方向拼接在一起。24

25(5)預測未來的GDP通過已擬合的線性回歸模型,對未來年份進行預測。只需將未來年份的數據輸入回歸方程,結合計算出的回歸系數,即能得出未來的GDP預測值。#預測未來GDPX_new=np.array([[len(gdp_data)],[len(gdp_data)+1]])#未來兩年X_new_b=np.c_[np.ones((X_new.shape[0],1)),X_new]gdp_predict=X_new_b.dot(theta_best)print("未來GDP預測:",gdp_predict)首先創建了未來兩年的年份數據X_new,并與偏置項拼接為矩陣X_new_b。然后將該矩陣與回歸系數theta_best相乘,得到了未來兩年的GDP預測值。通過這種方式,利用線性回歸模型可以預測未來的經濟增長情況。運行結果:GDP年度增長率:[0.753904150.641368250.690387680.632911390.681341720.624674650.620796690.616966580.66428206]回歸系數:[18.581090910.12442424]未來GDP預測:[19.8253333319.94975758]26Numpy的方法與屬性匯總表類別方法/屬性說明數組創建np.array()從Python列表或元組創建數組。np.zeros()創建全零數組,指定形狀。np.ones()創建全一數組,指定形狀。np.arange()創建等差序列數組,類似于range函數。np.linspace()在指定范圍內創建等距數值數組。np.eye()創建單位矩陣。np.random.rand()創建0到1之間均勻分布的隨機數數組。np.random.randint()創建整數隨機數數組,指定范圍和形狀。數組屬性ndarray.shape返回數組的形狀(行數和列數)。ndarray.size返回數組的元素總數。ndarray.ndim返回數組的維數。ndarray.dtype返回數組元素的數據類型。ndarray.itemsize返回數組中每個元素的字節大小。數組索引和切片ndarray[index]根據索引訪問數組元素,支持負索引。ndarray[start:end:step]進行切片操作,支持步長選擇。np.where()根據條件返回滿足條件的索引或替換值。np.take()從數組中提取指定位置的元素,支持多維數組。數組運算np.add()元素逐一相加。np.subtract()元素逐一相減。np.multiply()元素逐一相乘。np.divide()元素逐一相除。np.power()對每個元素求冪。np.exp()計算數組中所有元素的指數。np.sqrt()計算數組中所有元素的平方根。np.log()計算數組中所有元素的自然對數。np.abs()計算數組中所有元素的絕對值。統計函數np.sum()計算數組的總和,可以指定軸(axis)求和。np.mean()計算數組的均值。np.median()計算數組的中位數。np.std()計算數組的標準差。np.var()計算數組的方差。np.min()找到數組中的最小值。np.max()找到數組中的最大值。np.cumsum()計算數組的累積和。np.cumprod()計算數組的累積積。27類別方法/屬性說明數組創建np.array()從Python列表或元組創建數組。線性代數運算np.dot()計算兩個數組的點積(矩陣乘法)。np.matmul()矩陣乘法,支持多維矩陣相乘。np.linalg.

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論