<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
今天我看到線性規劃模型開頭的介紹,特別不錯,因此,我把它記錄下來了,分享給大家
在工程技術、經濟管理、科學研究、軍事作戰訓練及日常生活等眾多領域,人們常常會遇到各種優化問題。例如,在生產經營中,我們總是希望制定最優的生產計劃,充分利用已有的人力、物力資源,獲得最大的經濟效益;在運輸問題中,我們總是希望設計最優的運輸方案,在完成運輸任務的前提下,力求運輸成本最小等。【針對優化問題的數學建模問題也是數學建模競賽中一類比較常見的問題,這樣的問題常常可以使用數學規劃模型進行研究。】
數學規劃
是運籌學的一個重要分支,而線性規劃又是數學規劃中的一部分主要內容。很多實際問題都可以歸結為“線性規劃”問題。線性規劃有比較完善的理論基礎和有效的求解方法,在實際問題中有極其廣泛地應用。特別是隨著計算機技術的飛速發展,線性規劃的應用在深度和廣度上有了極大的提高。
上一篇文章python數學建模之Numpy 應用介紹與Pandas學習
# Numpy的基本使用 ''' Numpy提供了兩種基本的物件:ndarray儲存單一資料型別的多維陣列; ufunc是能夠對陣列進行處理的函數 1-匯入函數 import numpy as np 2-陣列建立 2-1 array 可將列表或元組轉化為ndarray陣列 2-2 arange 在給定區間內建立等差陣列,格式: arange(start=None, stop=None, step=None,dtype=None) 【step表示步長間隔】 2-3 linspace 在給定區間內建立間隔相等的陣列,格式: linspace(start, stop, num=50, endpoint=True) 【間隔相等的num個資料,其num預設值是50】 2-4 logspace 在給定區間內生成等比陣列,格式: logspace(start, stop, num=50, endpoint=True, base=10.0) 【預設生成區間[10start(次方), 10stop()次方]上的num個資料的等比陣列】 以及 ones、zeros、empty和ones_like等系列函數的運用: '''
# numpy.array # array()函數,括號內可以是列表、元組、陣列、迭代物件、生成器 import numpy as np print(np.array([6, 6, 6])) # 列表 print(np.array((8, 8, 8))) # 元組 print(np.array(np.array([9, 9, 9]))) # 陣列 print(np.array(range(10))) # 迭代物件 / 整型 print(np.array([i**2 for i in range(10)])) # 生成器 # 建立10以內的奇數的陣列: print(np.array([i for i in range(1, 10, 2)])) print(np.array([i for i in range(10) if i % 2 != 0])) # 建立10以內的偶數的陣列: print(np.array([i for i in range(0, 10, 2)])) print(np.array([i for i in range(10) if i % 2 == 0])) # 列表中元素型別不相同 print(np.array([5, 2, '0'])) # ['5' '2' '0'] # 浮點型 print(np.array([3, 4, 5.2])) # 二維陣列:【巢狀序列(列表、元組均可)】 print(np.array([[6, 7, 8], ('lxw', 'cw', 'wl')])) print(np.array([[6, 7, 8], ('lxw', 'cw', 'wl')]).ndim) # ndim(維度): 2 # 巢狀數量不一致:【強制轉化為一維,推薦不用】 print(np.array([[6, 7, 8], ('lxw', 'cw', 'wl', 'npy')], dtype=object)) print(np.array([[6, 7, 8], ('lxw', 'cw', 'wl', 'npy')], dtype=object).ndim) # ndim(維度):1 print(np.array([[6, 7, 8], ('lxw', 'cw', 'wl', 'npy')], dtype=object).shape) # 執行結果:(2,) print(np.array([[6, 7, 8], [9, 9, 6, 9]], dtype=object)) print(np.array([[6, 7, 8], [9, 9, 6, 9]], dtype=object).ndim) # ndim(維度):1 print(np.array([[6, 7, 8], [9, 9, 6, 9]], dtype=object).shape) # 執行結果:(2,) -> 代表兩行一列
# numpy.empty ''' numpy.empty 方法用來建立一個指定形狀(shape)、資料型別(dtype)且未初始化的陣列 numpy.empty(shape, dtype = float, order = 'C') 引數說明: 引數 描述 shape 陣列形狀 dtype 資料型別,可選 order 有"C"和"F"兩個選項,分別代表,行優先和列優先,在計算機記憶體中的儲存元素的順序 ''' import numpy as np lxw = np.empty([3, 4], dtype=int) print(lxw) # 注意:陣列元素為隨機值,因為它們未初始化
# numpy.zeros ''' 建立指定大小的陣列,陣列元素以 0 來填充: numpy.zeros(shape, dtype = float, order = 'C') 引數說明: order : 'C' 用於 C 的行陣列,或者 'F' 用於 FORTRAN 的列陣列 ''' import numpy as np lxw = np.zeros(6) # 預設為浮點數 print(lxw) lxw2 = np.zeros((6, ), dtype=int) # 設定型別為整數 print(lxw2) # 自定義型別 lxw3 = np.zeros((2, 2), dtype=[('lxw', 'i2'), ('lxw2', 'i4')]) print(lxw3)
# numpy.ones '''建立指定形狀的陣列,陣列元素以 1 來填充: numpy.ones(shape, dtype = None, order = 'C') ''' import numpy as np lxw4 = np.ones(8) # 預設浮點數 print(lxw4) lxw5 = np.ones([2, 2], dtype=int) print(lxw5)
# numpy.asarray ''' numpy.asarray 類似 numpy.array,但 numpy.asarray 引數只有三個,比 numpy.array 少兩個。 numpy.asarray(a, dtype = None, order = None) 引數說明: 引數 描述 a 任意形式的輸入引數,可以是,列表, 列表的元組, 元組, 元組的元組, 元組的列表,多維陣列 ''' # 將列表轉換為 ndarray: import numpy as np x = [5, 2, 0] lxw6 = np.asarray(x) print(lxw6) # 將元組轉換為 ndarray import numpy as np x2 = (1, 3, 1, 4) lxw7 = np.asarray(x2) print(lxw7) # 設定了 dtype 引數 import numpy as np x4 = [6, 6, 9] lxw9 = np.asarray(x4, dtype=float) print(lxw9)
# numpy.frombuffer ''' numpy.frombuffer 用於實現動態陣列;接受 buffer 輸入引數,以流的形式讀入轉化成 ndarray 物件。 格式如下: numpy.frombuffer(buffer, dtype = float, count = -1, offset = 0) 注:buffer 是字串的時候,Python3 預設 str 是 Unicode 型別,所以要轉成 bytestring 在原 str 前加上 b。 引數說明: 引數 描述 buffer 可以是任意物件,會以流的形式讀入。 dtype 返回陣列的資料型別,可選 count 讀取的資料數量,預設為-1,讀取所有資料。 offset 讀取的起始位置,預設為0 ''' import numpy as np s = b'lxw_pro' lxw10 = np.frombuffer(s, dtype='S1') print(lxw10)
# numpy.fromiter ''' numpy.fromiter 方法從可迭代物件中建立 ndarray 物件,返回一維陣列。 numpy.fromiter(iterable, dtype, count=-1) ''' import numpy as np lst = range(6) it = iter(lst) lxw11 = np.fromiter(it, dtype=float) print(lxw11)
# numpy.arange ''' numpy 包中的使用 arange 函數建立數值範圍並返回 ndarray 物件,函數格式如下: numpy.arange(start, stop, step, dtype) 根據 start 與 stop 指定的範圍以及 step 設定的步長,生成一個 ndarray。 引數說明: 引數 描述 start 起始值,預設為0 stop 終止值(不包含) step 步長,預設為1 dtype 返回ndarray的資料型別,如果沒有提供,則會使用輸入資料的型別 ''' # 生成0和5的陣列 import numpy as np a = np.arange(6) print(a) # 設定返回型別位 float import numpy as np a2 = np.arange(6, dtype=float) print(a2) # 設定了起始值、終止值及步長 import numpy as np a3 = np.arange(20, 52, 5) print(a3)
# numpy.linspace ''' numpy.linspace 函數用於建立一個一維陣列,陣列是一個等差數列構成的,格式如下: np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None) 引數說明: 引數 描述 start 序列的起始值 stop 序列的終止值,如果endpoint為true,該值包含於數列中 num 要生成的等步長的樣本數量,預設為50 endpoint 該值為 true 時,數列中包含stop值,反之不包含,預設是True。 retstep 如果為 True 時,生成的陣列中會顯示間距,反之不顯示。 dtype ndarray 的資料型別 ''' # 類似等差數列 import numpy as np a4 = np.linspace(1, 10, 5) print(a4) # 設定元素全部是1的等差數列 import numpy as np a5 = np.linspace(1, 1, 10) print(a5) # 將 endpoint 設為 false,不包含終止值 import numpy as np a6 = np.linspace(8, 22, 4, endpoint=False) print(a6) # 注:將 endpoint 設為 true,則會包含 22 a6 = np.linspace(8, 22, 4, endpoint=True) print(a6) # 設定間距 import numpy as np a7 = np.linspace(5, 10, 5).reshape([5, 1]) print(a7)
# numpy.logspace ''' numpy.logspace 函數用於建立一個於等比數列。格式如下: np.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None) base 引數意思是取對數的時候 log 的下標。 引數 描述 start 序列的起始值為:base ** start stop 序列的終止值為:base ** stop。如果endpoint為true,該值包含於數列中 num 要生成的等步長的樣本數量,預設為50 endpoint 該值為 true 時,數列中中包含stop值,反之不包含,預設是True。 base 對數 log 的底數。 dtype ndarray 的資料型別 ''' import numpy as np a8 = np.logspace(1, 2, num=10) # 預設底數是 10 print(a8) # 將對數的底數設定為 2 import numpy as np a9 = np.logspace(0, 8, 9, base=2) print(a9)
# 綜合運用 import numpy as np ltw = np.array([3, 3, 4, 4]) # 生成整型陣列 ltw2 = ltw.astype(float) # 轉為浮點數 ltw3 = np.array([5, 2, 1], dtype=float) # 浮點數 print(ltw) print(ltw2) print(ltw3) # 比較型別 print(ltw.dtype, ltw2.dtype, ltw3.dtype) aa = np.array([ [2, 5, 8], [9, 6, 2] ]) print(aa) bb = np.arange(2, 9) print(bb) # 執行結果為:[2 3 4 5 6 7 8] cc = np.linspace(2, 5, 4) print(cc) # 執行結果為:[2. 3. 4. 5.] dd = np.logspace(1, 4, 4, base=2) # base控制的是幾次方 print(dd) # 執行結果為:[ 2. 4. 8. 16.]
# 綜合運用【ones、zeros、empty、ones_like】 import numpy as np a = np.ones(6, dtype=int) print(a) # 執行結果為:[1 1 1 1 1 1] b = np.ones((6,), dtype=int) print(b) # 執行結果為:[1 1 1 1 1 1] c = np.ones((3, 1)) print(c) # 輸出3行一列的陣列 # 執行結果為: # [[1.] # [1.] # [1.]] d = np.zeros(4) print(d) # 執行結果為:[0. 0. 0. 0.] e = np.empty(3) print(e) # 生成3個元素的空陣列行向量 # 執行結果為:[1. 1. 1.] f = np.eye(3) print(f) # 生成3階單位陣 # 執行結果為: # [[1. 0. 0.] # [0. 1. 0.] # [0. 0. 1.]] g = np.eye(3, k=1) print(g) # 生成第k對角線的元素為1,其他元素為0的3階方陣 # 執行結果為: # [[0. 1. 0.] # [0. 0. 1.] # [0. 0. 0.]] h = np.zeros_like(b) print(h) # 生成與a同維數的全0陣列 # 執行結果為:[0 0 0 0 0 0]
# NumPy 切片和索引 ''' ndarray物件的內容可以通過索引或切片來存取和修改,與 Python 中 list 的切片操作一樣。 ndarray 陣列可以基於 0 - n 的下標進行索引, 切片物件可以通過內建的 slice 函數,並設定 start, stop 及 step 引數進行,從原陣列中切割出一個新陣列 ''' import numpy as np # 通過 arange() 函數建立 ndarray 物件 a = np.arange(10) lxw = slice(2, 9, 3) # 索引從2到9,間隔為3 print(a[lxw]) # [2 5 8] # 通過切片操作 a = np.arange(10) lxw2 = a[2:9:3] # 這裡的切片操作和Python中list的操作是一樣的 print(lxw2) # [2 5 8] # 比如: import numpy as np lxw3 = np.arange(10) print(lxw3[6]) # 6 print(lxw3[6:]) # [6 7 8 9] print(lxw3[2:7]) # [2 3 4 5 6] # 多維陣列同樣適用上述索引提取方法 import numpy as np lxw4 = np.array([ [6, 6, 6], [5, 2, 0], [5, 8, 9] ]) print(lxw4) print(lxw4[1:]) # 切片還可以包括省略號 …,來使選擇元組的長度與陣列的維度相同。 # 如果在行位置使用省略號,它將返回包含行中元素的 ndarray import numpy as np lxw5 = np.array([ [1, 2, 9], [2, 5, 4], [3, 4, 8] ]) print(lxw5[1, ...]) # [2 5 4] 第二行元素 print(lxw5[..., 2]) # [9 4 8] 第三列元素 print(lxw5[1:, ...]) # 第二行及剩下元素 print(lxw5[..., 1:]) # 第二列及剩下元素
array
陣列與Python基礎資料結構列表(list
)的區別
是:NumPy 比一般的 Python 序列提供更多的索引方式。
# 1-整數陣列索引 import numpy as np b = np.array([ [6, 2, 9], [4, 3, 9], [5, 2, 3] ]) lxw6 = b[ [0, 1, 2], [1, 2, 1] ] print(lxw6) # 輸出 [2 9 2] # 獲取四個角元素 import numpy as np aq = np.array([ [1, 2, 3, 4], [2, 3, 4, 5], [3, 4, 5, 6], [4, 5, 6, 7] ]) print(aq) hj = np.array([[0, 0], [3, 3]]) lj = np.array([[0, 3], [0, 3]]) yq = aq[hj, lj] print(yq) print() # 可藉助切片 : 或 … 與索引陣列組合: import numpy as np jz = np.array([ [3, 5, 9], [5, 2, 6], [2, 9, 8] ]) jz1 = jz[:2, :2] print(jz1) jz2 = jz[:2, [0, 1]] print(jz2) jz3 = jz[..., 1:] print(jz3)
# 布林索引 # 布林索引可通過布林運算(如:比較運運算元)來獲取符合指定條件的元素的陣列 # 獲取大於5的元素: import numpy as np br = np.array([ [6, 7, 8], [5, 2, 1], [6, 6, 9], [2, 4, 5] ]) print(br) print(br[br > 5]) # 輸出 [6 7 8 6 6 9] # 使用 ~(取補運運算元)來過濾 NaN: import numpy as np bu = np.array([5, np.nan, 2, 0, np.nan, np.nan, 5, 8]) print(bu[~np.isnan(bu)]) # 輸出 [5. 2. 0. 5. 8.] # 從陣列中過濾掉非複數元素: import numpy as np lv = np.array([2+2.9j, 4, 9, 2+8.2j, 8]) print(lv[np.iscomplex(lv)]) # 輸出 [2.+2.9j 2.+8.2j]
# 花式索引【利用整數陣列進行索引】 # 花式索引根據索引陣列的值作為目標陣列的某個軸的下標來取值。 # 對於使用一維整型陣列作為索引,如果目標是一維陣列,那麼索引的結果就是對應下標的行, # 如果目標是二維陣列,那麼就是對應位置的元素。 # 注:花式索引跟切片不一樣,它總是將資料複製到新陣列中。 # 1.傳入順序索引陣列 import numpy as np sx = np.arange(32).reshape(8, 4) print(sx[[5, 2, 1, 6]]) # 2.傳入倒序索引陣列 import numpy as np dx = np.arange(32).reshape(8, 4) print(dx[[-5, -2, -1, -6]]) # 3.傳入多個索引陣列(要使用np.ix_) import numpy as np dg = np.arange(32).reshape(8, 4) print(dg[np.ix_([2, 3, 5, 1], [3, 2, 0, 1])])
三個實用小方法:
import numpy as np sy = np.array([ [3, 5, 6], [2, 6, 2], [5, 2, 0], [3, 3, 4] ]) # 原陣列 print(sy) # 1- print(sy[(sy > 3) & (sy < 6)]) # 條件記得加小括號 # 2- print(sy[np.logical_and(sy > 3, sy < 6)]) # 3- print(sy[np.all([sy > 3, sy < 6], axis=0)])
相關程式碼如下:
import numpy as np x = np.arange(16).reshape(4, 4) print(x) # 生成4行4列的陣列 x2 = x[2][1] print(x2) # 輸出 9 x3 = x[2, 1] print(x3) # 輸出 9 x4 = x[1:2, 2:4] print(x4) # 輸出 [[6 7]] xx = np.array([0, 1, 2, 1]) print(x[xx == 1]) # 輸出x的第2、4行元素
# Pandas學習(續) # Pandas庫是在Numpy庫基礎上開發的一種資料分析工具 ''' Pandas主要提供了三種資料結構: 1-Series: 帶標籤的一維陣列 2-DataFrame: 帶標籤且大小可變得二維表格結構 3-Panel: 帶標籤且大小可變得三維陣列 ''' # 生成二維陣列 # 生成服從標準正態分佈的24*4亂數矩陣,並儲存為DataFrame資料結構。 import pandas as pd import numpy as np dates = pd.date_range(start='20220622', end='20220707', freq='D') print(dates)
執行效果如下:
lxw1 = pd.DataFrame(np.random.randn(16, 4), index=dates, columns=list('ABCD')) lxw2 = pd.DataFrame(np.random.randn(16, 4)) print(lxw1) print(lxw2)
執行結果如下:
# 將lxw1的資料寫入excel檔案 lxw1.to_excel('假期培訓時間.xlsx') lxw1.to_excel("時間任意.xlsx", index=False) # 不包含行索引 # 將lxw2的資料寫入csv檔案 lxw2.to_csv('假期培訓時間.csv') lxw2.to_csv("時間隨意.csv", index=False) # 不包含行索引 # 建立檔案物件 f = pd.ExcelWriter('培訓時間(格式).xlsx') # 把lxw1寫入Excel檔案 lxw1.to_excel(f, "Shell1") # 把lxw2寫入Excel檔案 lxw2.to_excel(f, "Sheet2") f.save()
部分效果圖如下:
# 從檔案中讀入資料: import pandas as pd lxw3 = pd.read_csv("假期培訓時間.csv", usecols=range(1, 4)) print(lxw3)
執行結果如下:
lxw4 = pd.read_excel("培訓時間(格式).xlsx", "Sheet2", usecols=range(1, 3)) print(lxw4)
# 資料的一些預處理 # DataFrame資料的拆分、合併和分組計算: import pandas as pd import numpy as np lxw5 = pd.DataFrame(np.random.randint(1, 6, (10, 4)), columns=list('ABCD')) print(lxw5)
lxww = lxw5[:5] # 獲取前五行資料 print(lxww)
lxwy = lxw5[5:] # 獲取第六行以後的資料 print(lxwy)
wy = pd.concat([lxww, lxwy]) # 資料行合併 print(wy)
q1 = lxw5.groupby('A').mean() # 資料分組求均值 print(np.around(q1, decimals=2)) # decimals表示保留幾位小數
q2 = lxw5.groupby('A').apply(sum) # 資料分組求和 print(q2)
# 資料的選取與操作 ''' 對DataFrame進行選取,要從3個層次考慮:行列、區域、單元格 1-選用中括號[]選取行列 2-使用行和列的名稱進行標籤定位的df.loc[] 3-使用整型索引(絕對位置索引)的df.iloc[] 當然,在資料預處理中,需要對缺失值等進行一些特殊處理 ''' # 資料操作: import pandas as pd import numpy as np qq = pd.DataFrame(np.random.randint(1, 5, (6, 4)), index=['a', 'b', 'c', 'd', 'e', 'f'], columns=['one', 'two', 'three', 'four']) qq.loc['c', 'two'] = np.nan # 修改第三行第二列的資料 print(qq)
ww = qq.iloc[1:4, 0:2] # 提取第二、三、四行,第一、二列資料 print(ww)
qq['five'] = 'lxw' # 增加第五列資料 print(qq)
qq2 = qq.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g']) # 增加行名 print(qq2)
qq3 = qq2.dropna() # 刪除有不確定值的行 print(qq3) # 從輸出不難看出,刪除了c行和g行
遇到的問題:
總結:
面臨著一次次的執行錯誤,一次又一次的解決,或許解決的難題越多,你懂的就會越來越多吧,就如同你經歷的一樣,你經歷的越多,知道的就越多!
到此這篇關於python數學建模是加深Numpy學習的文章就介紹到這了,更多相關python Numpy內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45