編程的一個(gè)用途是通過(guò)模擬來(lái)幫助我們理解真實(shí)世界。這一技術(shù)被應(yīng)用于科學(xué)、金融和許多其他定量領(lǐng)域。只要控制現(xiàn)實(shí)世界屬性的“規(guī)則”是已知的,你就可以編寫一個(gè)計(jì)算機(jī)程序來(lái) 探索 你遵循這些規(guī)則所得到的結(jié)果。在本文中,您將 用Python模擬三維太陽(yáng)系 使用流行的可視化庫(kù)Matplotlib
建網(wǎng)站原本是網(wǎng)站策劃師、網(wǎng)絡(luò)程序員、網(wǎng)頁(yè)設(shè)計(jì)師等,應(yīng)用各種網(wǎng)絡(luò)程序開發(fā)技術(shù)和網(wǎng)頁(yè)設(shè)計(jì)技術(shù)配合操作的協(xié)同工作。成都創(chuàng)新互聯(lián)專業(yè)提供成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè),網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站制作(企業(yè)站、成都響應(yīng)式網(wǎng)站建設(shè)公司、電商門戶網(wǎng)站)等服務(wù),從網(wǎng)站深度策劃、搜索引擎友好度優(yōu)化到用戶體驗(yàn)的提升,我們力求做到極致!
在這篇文章,你將能夠用Python創(chuàng)建你自己的3D太陽(yáng)系,你可以用你想要的多少太陽(yáng)和行星。下面是一個(gè)簡(jiǎn)單的太陽(yáng)系的一個(gè)例子,它有一個(gè)太陽(yáng)和兩個(gè)行星:
你還可以打開動(dòng)畫地板上的二維投影,更好地展示太陽(yáng)系的三維本質(zhì)。下面是同樣的太陽(yáng)系模擬,包括2D投影:
下面是這篇文章的概要,以便您知道接下來(lái)會(huì)發(fā)生什么:
在本文中,您將使用面向?qū)ο蟮木幊毯蚆atplotlib。如果您希望閱讀更多關(guān)于任何一個(gè)主題的內(nèi)容,您可以閱讀:
讓我們從使用Matplotlib在Python中模擬一個(gè)3D太陽(yáng)系開始。
太陽(yáng)系中的太陽(yáng)、行星和其他天體都是運(yùn)動(dòng)中的天體,它們相互吸引。引力在任何兩個(gè)物體之間施加。
如果這兩個(gè)對(duì)象有大量M_1和M_2是距離r然后,你可以用以下公式計(jì)算它們之間的引力:
常數(shù)G是一個(gè)引力常數(shù)。您將看到如何在模擬的版本中忽略這個(gè)常量,在本文中,您將使用任意單位的質(zhì)量和距離,而不是kg和m。
一旦你知道了兩個(gè)物體之間的引力,你就可以計(jì)算出加速度。a每個(gè)物體都是由于這種引力而經(jīng)歷的,使用以下公式:
使用這個(gè)加速度,你可以調(diào)整運(yùn)動(dòng)物體的速度。當(dāng)速度發(fā)生變化時(shí),速度和方向都會(huì)發(fā)生變化。
當(dāng)用Python模擬一個(gè)三維太陽(yáng)系時(shí),你需要用三維空間來(lái)表示太陽(yáng)系。因此,這個(gè)3D空間中的每個(gè)點(diǎn)都可以用三個(gè)數(shù)字來(lái)表示, x -, y -和 z -坐標(biāo)。例如,如果你想把太陽(yáng)放在太陽(yáng)系的中心,你可以將太陽(yáng)的位置表示為 (0, 0, 0) .
您還需要在3D空間中表示向量。矢量具有大小和方向。你需要像速度、加速度和力這樣的量的矢量,因?yàn)檫@些量都有一個(gè)方向和一個(gè)震級(jí)。
在本文中,我將不詳細(xì)討論向量代數(shù)。相反,我將陳述您需要的任何結(jié)果。你可以讀到更多關(guān)于向量與向量代數(shù)如果你愿意的話。
為了在代碼中更容易地處理向量,您可以創(chuàng)建一個(gè)類來(lái)處理它們。編寫這個(gè)類將作為對(duì)類和面向?qū)ο缶幊痰目焖偎⑿?。你可以讀到用Python進(jìn)行面向?qū)ο蟮木幊倘绻阌X得你需要一個(gè)更徹底的解釋。雖然您也可以創(chuàng)建一個(gè)類來(lái)處理3D空間中的點(diǎn),但這并不是必要的,在本文中我也不會(huì)創(chuàng)建一個(gè)類。
如果您熟悉向量和面向?qū)ο缶幊?,可以跳過(guò)本節(jié),只需在定義 Vector 班級(jí)。
創(chuàng)建一個(gè)名為 vectors.py 中,您將定義 Vector 班級(jí)。您將使用此腳本定義類并對(duì)其進(jìn)行測(cè)試。然后,可以刪除最后的測(cè)試代碼,只需在這個(gè)腳本中保留類定義:
這個(gè) __init__() 方法的 Vector 類有三個(gè)參數(shù),表示每個(gè)軸上的值。每個(gè)參數(shù)的默認(rèn)值為 0 表示該軸的原點(diǎn)。雖然我們不喜歡在Python中使用單個(gè)字母名稱, x , y ,和 z 是恰當(dāng)?shù)?,因?yàn)樗鼈兇砹藬?shù)學(xué)中常用的笛卡爾坐標(biāo)系的術(shù)語(yǔ)。
您還定義了兩個(gè)Dunder方法來(lái)將對(duì)象表示為一個(gè)字符串:
在代碼段的末尾,您可以更多地了解這兩種類型的字符串表示之間的差異。Python編碼書第9章 .
測(cè)試代碼塊的輸出如下:
在Python項(xiàng)目中的這個(gè)3D太陽(yáng)系中,如果 Vector 類是可索引的,以便您可以使用 [] 帶有索引以提取其中一個(gè)值的符號(hào)。使用當(dāng)前形式的類,如果添加 print(test[0]) 在您的腳本中,您將得到一個(gè) TypeError 說(shuō) Vector 對(duì)象不可訂閱。您可以通過(guò)向類定義中添加另一個(gè)Dud方法來(lái)修復(fù)這個(gè)問(wèn)題:
通過(guò)定義 __getitem__() ,你做了 Vector 可索引的類。向量中的第一項(xiàng)是 x 的價(jià)值。 y 的價(jià)值。 z 。任何其他索引都會(huì)引發(fā)錯(cuò)誤。測(cè)試代碼塊的輸出如下:
test[0] 返回向量中的第一個(gè)項(xiàng), x .
可以定義類的對(duì)象的加法和減法。 __add__() 和 __sub__() DunderMethod.這些方法將使您能夠使用 + 和 - 執(zhí)行這些操作的符號(hào)。如果沒(méi)有這些Dud方法,則使用 + 和 - 提出 TypeError .
若要添加或減去兩個(gè)向量,可以分別添加或減去向量的每個(gè)元素:
雙管齊下 __add__() 和 __sub__() 返回另一個(gè) Vector 對(duì)象,每個(gè)元素等于兩個(gè)原始向量中相應(yīng)元素的加減。輸出如下:
對(duì)于乘法和除法,您也可以這樣做,盡管在處理向量時(shí),這些操作需要更多的注意。
在處理向量時(shí),不能僅僅引用“乘法”,因?yàn)橛胁煌愋偷摹俺朔ā薄T谶@個(gè)項(xiàng)目中,你只需要標(biāo)量乘法。標(biāo)量乘法是指向量與標(biāo)量相乘(標(biāo)量有一個(gè)數(shù)量級(jí),但沒(méi)有方向)。但是,在本小節(jié)中,您還將定義點(diǎn)積兩個(gè)向量。你想用 * 運(yùn)算符,既適用于標(biāo)量乘法,也適用于點(diǎn)積。因此,可以定義 __mul__() DunderMethod:
使用 * 運(yùn)算符將取決于第二個(gè)操作數(shù),即 * 符號(hào),是標(biāo)量或向量。如果由參數(shù)表示的第二個(gè)操作數(shù) other ,是類型的 Vector ,計(jì)算了點(diǎn)積。但是,如果 other 是類型的 int 或 float ,返回的結(jié)果是一個(gè)新的 Vector ,按比例調(diào)整。
以上代碼的輸出如下:
如果您想要標(biāo)量乘法,則需要標(biāo)量乘法。 后 這個(gè) * 象征。如果您試圖運(yùn)行該語(yǔ)句 3*Vector(3, 5, 9) 相反, TypeError 將被提高,因?yàn)? Vector 類不是用于使用的有效操作數(shù)。 * 帶有類型的對(duì)象 int .
兩個(gè)向量是分不開的。但是,可以將向量除以標(biāo)量。您可以使用 / 運(yùn)算符 Vector 如果定義 __truep__() DunderMethod:
產(chǎn)出如下:
如果你有一個(gè)向量(x,y,z),您可以找到它的震級(jí)使用表達(dá)式(x^2+y^2+z^2)。你也可以規(guī)范化向量。歸一化給出一個(gè)方向相同但大小為 1 。您可以通過(guò)將向量的每個(gè)元素除以矢量的大小來(lái)計(jì)算歸一化向量。
可以定義兩個(gè)新方法來(lái)完成 Vector 班級(jí):
測(cè)試代碼提供了以下輸出:
第三個(gè)輸出給出了歸一化向量的大小,表明它的大小是 1 .
根據(jù)使用的IDE或其他工具,在分割時(shí)可能會(huì)收到警告 self.x , self.y ,和 self.z ,如在 __truep__() 和 normalize() 。您不需要擔(dān)心這個(gè)問(wèn)題,但是如果您想要修復(fù)它,可以通過(guò)更改 __init__() 簽署下列任何一項(xiàng):
或
這兩個(gè)選項(xiàng)都讓IDE知道參數(shù)應(yīng)該是浮動(dòng)的。在第二個(gè)選項(xiàng)中,您使用類型暗示來(lái)實(shí)現(xiàn)。
您現(xiàn)在可以刪除此腳本末尾的測(cè)試代碼,以便您在 vectors.py 是類的定義。
現(xiàn)在,你可以開始研究Python中的3D太陽(yáng)系了。您將創(chuàng)建兩個(gè)主要類:
你將使用Matplotlib來(lái)創(chuàng)建和可視化太陽(yáng)系。您可以在終端中使用以下內(nèi)容來(lái)安裝Matplotlib:
或
這個(gè) Axes3D Matplotlib中的物體將“托管”太陽(yáng)系。如果您使用過(guò)Matplotlib,并且主要使用了2D繪圖,那么您將使用(有意或不知情的) Axes 對(duì)象。 Axes3D 的3D等效 Axes ,顧名思義!
現(xiàn)在是開始編寫和測(cè)試這些類的時(shí)候了。您可以創(chuàng)建兩個(gè)新文件:
接下來(lái),您將開始處理 SolarSystem 班級(jí)。
您將在整個(gè)項(xiàng)目中使用任意單元。這意味著,與其用米作為距離,而用公斤作為質(zhì)量,你將使用沒(méi)有單位的數(shù)量。參數(shù) size 用于定義包含太陽(yáng)系的立方體的大?。?/p>
定義 SolarSystem 類的 __init__() 方法,其中包含參數(shù)。 size 。您還定義了 bodies 屬性。這個(gè)屬性是一個(gè)空列表,當(dāng)你稍后創(chuàng)建它們時(shí),它將包含太陽(yáng)系內(nèi)的所有天體。這個(gè) add_body() 方法可以用來(lái)將軌道天體添加到太陽(yáng)系中。
下一步是介紹Matplotlib。屬性創(chuàng)建圖形和一組軸。 subplots() 在 matplotlib.pyplot :
你打電話 plt.subplots() ,它返回一個(gè)圖形和一組軸。返回的值分配給屬性。 fig 和 ax 。你打電話 plt.subplots() 有以下論點(diǎn):
您還可以調(diào)用該方法。 tight_layout() 。這是 Figure 類在Matplotlib中。此方法減少了圖形邊緣的邊距。
到目前為止,您可以在控制臺(tái)/REPL中嘗試代碼:
這給出了一組空的三維軸的圖形:
您將使用 size 參數(shù)設(shè)置此多維數(shù)據(jù)集的大小。你會(huì)回到 SolarSystem 稍后上課。目前,您可以將您的注意力轉(zhuǎn)向定義 SolarSystemBody 班級(jí)。
您可以開始創(chuàng)建 SolarSystemBody 類及其 __init__() 方法。我正在截?cái)? SolarSystem 下面代碼中的類定義用于顯示。在此代碼塊和以后的代碼塊中,包含 # ... 指出您之前編寫的未顯示的代碼:
中的參數(shù)。 __init__() 方法是:
你也叫 add_body() 方法中定義的 SolarSystem 類將這個(gè)天體添加到太陽(yáng)系中。稍后,您將向 __init__() 方法。
中定義另一個(gè)方法。 SolarSystemBody 用其當(dāng)前的位置和速度移動(dòng)物體:
這個(gè) move() 方法重新定義 position 屬性的 velocity 屬性。我們已經(jīng)討論過(guò)你是如何用任意單位來(lái)計(jì)算距離和質(zhì)量的。你也在使用任意的時(shí)間單位。每個(gè)‘時(shí)間單位’將是循環(huán)的一個(gè)迭代,您將使用它來(lái)運(yùn)行模擬。因此, move() 將身體按一次迭代所需的數(shù)量移動(dòng),這是一個(gè)時(shí)間單位。
你們已經(jīng)創(chuàng)建了Matplotlib結(jié)構(gòu),它將容納太陽(yáng)系及其所有天體?,F(xiàn)在,您可以添加一個(gè) draw() 方法 SolarSystemBody 若要在Matplotlib圖上顯示主體,請(qǐng)執(zhí)行以下操作。您可以通過(guò)繪制一個(gè)標(biāo)記來(lái)完成這一任務(wù)。
在這樣做之前,您需要在 SolarSystemBody 若要控制將繪制的標(biāo)記的顏色和大小以表示身體,請(qǐng)執(zhí)行以下操作:
類屬性 min_display_size 和 display_log_base 設(shè)置參數(shù),以確定您將在3D圖上顯示的標(biāo)記的大小。您設(shè)置了一個(gè)最小的大小,以便您顯示的標(biāo)記不太小,即使對(duì)于小的身體也是如此。您將使用對(duì)數(shù)標(biāo)度將質(zhì)量轉(zhuǎn)換為標(biāo)記大小,并將此對(duì)數(shù)的基值設(shè)置為另一個(gè)類屬性。
這個(gè) display_size 屬性中的實(shí)例屬性。 __init__() 方法在計(jì)算的標(biāo)記大小和所設(shè)置的最小標(biāo)記大小之間進(jìn)行選擇。為了在這個(gè)項(xiàng)目中確定身體的顯示大小,你要使用它的質(zhì)量。
您還可以添加 colour 屬性 __init__() ,暫時(shí)默認(rèn)為黑色。
要測(cè)試這些新添加的內(nèi)容,可以在控制臺(tái)/REPL中嘗試以下內(nèi)容:
第一次呼叫 body.draw() 在原點(diǎn)繪制物體,因?yàn)槟闶褂玫氖翘?yáng)系天體的默認(rèn)位置。打電話給 body.move() 用一個(gè)“時(shí)間單位”所需的數(shù)量移動(dòng)身體。因?yàn)樯眢w的速度是 (1, 1, 1) ,身體將沿著三個(gè)軸中的每一個(gè)移動(dòng)一個(gè)單位。第二次呼叫 body.draw() 在第二個(gè)位置畫太陽(yáng)系天體。請(qǐng)注意,當(dāng)您這樣做時(shí),軸將自動(dòng)重新排列。您很快就會(huì)在主代碼中處理這個(gè)問(wèn)題。
您可以返回到 SolarSystem 通過(guò)給太陽(yáng)系及其天體添加兩種新的方法,將其分類和連接起來(lái): update_all() 和 draw_all() :
這個(gè) update_all() 方法穿過(guò)太陽(yáng)系中的每一個(gè)物體,移動(dòng)并畫出每一個(gè)物體。這個(gè) draw_all() 方法使用太陽(yáng)系的大小設(shè)置三軸的限制,并通過(guò) pause() 功能。此方法還清除軸,為下一個(gè)繪圖做好準(zhǔn)備。
您可以開始構(gòu)建一個(gè)簡(jiǎn)單的太陽(yáng)系,并通過(guò)創(chuàng)建一個(gè)名為 simple_solar_system.py :
運(yùn)行此腳本時(shí),您將看到一個(gè)黑體從情節(jié)的中心移動(dòng):
您可以更改三維圖形的透視圖,這樣您就可以直接沿著其中一個(gè)軸查看3D軸。可以通過(guò)將視圖的方位和仰角設(shè)置為 0 在……里面 SolarSystem.__init__() :
跑動(dòng) simple_solar_system.py 現(xiàn)在給出以下觀點(diǎn):
這個(gè) x -軸現(xiàn)在垂直于你的屏幕。因?yàn)槟阍?D顯示器上顯示一個(gè)3D視圖,所以你總是有一個(gè)方向與你用來(lái)顯示圖形的2D平面垂直。這一限制使得很難區(qū)分物體何時(shí)沿該軸運(yùn)動(dòng)。你可以通過(guò)改變身體的速度 simple_solar_system.py 到 (1, 0, 0) 并再次運(yùn)行腳本。身體似乎是靜止的,因?yàn)樗皇茄刂S移動(dòng),從你的屏幕出來(lái)!
您可以通過(guò)根據(jù)它的不同更改標(biāo)記的大小來(lái)改進(jìn)三維可視化。 x -協(xié)調(diào)??拷膶?duì)象看起來(lái)更大,而更遠(yuǎn)的對(duì)象看起來(lái)更小。您可以對(duì) draw() 方法中的 SolarSystemBody 班級(jí):
self.position[0] 表示身體的位置。 x -軸,即垂直于屏幕的軸。因子 30 除以是一個(gè)任意因素,您可以使用它來(lái)控制您希望這種效果有多強(qiáng)。
在本教程的后面,您還將添加另一個(gè)功能,將有助于可視化的三維運(yùn)動(dòng)的恒星和行星。
你有一個(gè)太陽(yáng)系,里面有可以移動(dòng)的物體。到目前為止,如果您只有一個(gè)身體,那么代碼可以正常工作。但那不是一個(gè)非常有趣的太陽(yáng)系!如果你有兩個(gè)或兩個(gè)以上的物體,它們就會(huì)通過(guò)相互的引力相互作用。
在這篇文章的開頭,我簡(jiǎn)要回顧了你需要處理兩個(gè)物體之間的引力的物理。由于在這個(gè)項(xiàng)目中使用的是任意單位,所以可以忽略引力常數(shù) G 簡(jiǎn)單地計(jì)算出由于兩個(gè)物體之間的重力而產(chǎn)生的力,如:
一旦你知道了兩個(gè)物體之間的力,因?yàn)镕=ma,您可以計(jì)算出每個(gè)對(duì)象必須使用的加速度:
一旦你知道加速度,你就可以改變物體的速度。
您可以添加兩個(gè)新方法,一個(gè)在 SolarSystemBody 另一個(gè)在 SolarSystem ,計(jì)算出任何兩個(gè)物體之間的力和加速度,并穿過(guò)太陽(yáng)系中的所有物體,并計(jì)算它們之間的相互作用。
第一種方法計(jì)算出兩個(gè)物體之間的引力,計(jì)算每個(gè)物體的加速度,并改變兩個(gè)物體的速度。如果您愿意,可以將這些任務(wù)分為三種方法,但在本例中,我將將這些任務(wù)放在 SolarSystemBody :
accelerate_due_to_gravity() 對(duì)類型的對(duì)象調(diào)用。 SolarSystemBody 需要另一個(gè) SolarSystemBody 身體作為一種爭(zhēng)論。參數(shù) self 和 other 代表兩個(gè)身體相互作用。此方法的步驟如下:
現(xiàn)在你可以計(jì)算出任何兩個(gè)天體之間的相互作用,你可以計(jì)算出太陽(yáng)系中所有天體之間的相互作用。你可以把你的注意力轉(zhuǎn)移到 SolarSystem 類的類:
這個(gè) calculate_all_body_interactions() 方法貫穿太陽(yáng)系的所有天體。每個(gè)天體與太陽(yáng)系中的其他天體相互作用:
現(xiàn)在,您已經(jīng)準(zhǔn)備好創(chuàng)建一個(gè)簡(jiǎn)單的太陽(yáng)系,并測(cè)試您到目前為止編寫的代碼。
在這個(gè)項(xiàng)目中,您將關(guān)注創(chuàng)建兩種類型的天體之一:太陽(yáng)和行星。您可以為這些機(jī)構(gòu)創(chuàng)建兩個(gè)類。新類繼承自 SolarSystemBody :
這個(gè) Sun 類的默認(rèn)質(zhì)量為10,000個(gè)單位,并將顏色設(shè)置為黃色。使用字符串 'yellow' ,這是Matplotlib中的有效顏色。
在 Planet 類創(chuàng)建一個(gè) itertools.cycle 對(duì)象有三種顏色。在這種情況下,這三種顏色是紅色、綠色和藍(lán)色。你可以使用你想要的任何RGB顏色,也可以使用任意數(shù)量的顏色。在這個(gè)類中,使用帶有RGB值的元組來(lái)定義顏色,而不是使用顏色名稱的字符串。這也是在Matplotlib中定義顏色的有效方法。使用 next() 每當(dāng)你創(chuàng)建一個(gè)新的行星時(shí)。
您還將默認(rèn)質(zhì)量設(shè)置為10個(gè)單元。
現(xiàn)在,你可以創(chuàng)建一個(gè)太陽(yáng)系,其中一個(gè)太陽(yáng)和兩個(gè)行星在 simple_solar_system.py :
在這個(gè)腳本中,您創(chuàng)建了一個(gè)太陽(yáng)和兩個(gè)行星。你把太陽(yáng)和行星分配給變量 sun 和 planets ,但這并不是嚴(yán)格要求的,因?yàn)? Sun 和 Planet 對(duì)象被創(chuàng)建,它們被添加到 solar_system 你不需要直接引用它們。
你用一個(gè) while 循環(huán)來(lái)運(yùn)行模擬。循環(huán)在每次迭代中執(zhí)行三個(gè)操作。運(yùn)行此腳本時(shí),將獲得以下動(dòng)畫:
它起作用了,算是吧。你可以看到太陽(yáng)錨定在這個(gè)太陽(yáng)系的中心,行星受到太陽(yáng)引力的影響。除了行星在包含你電腦屏幕的平面上的運(yùn)動(dòng)(這些是 y -和 z --軸),你也可以看到行星越來(lái)越大,因?yàn)樗鼈円苍? x -軸,垂直于屏幕。
然而,你可能已經(jīng)注意到行星的一些奇怪的行為。當(dāng)它們被安排在太陽(yáng)后面時(shí),行星仍然被展示在太陽(yáng)的前面。這不是數(shù)學(xué)上的問(wèn)題--如果你跟蹤行星的位置,你會(huì)發(fā)現(xiàn) x -坐標(biāo)顯示,它們實(shí)際上是在太陽(yáng)后面,正如你所預(yù)料的那樣。
這個(gè)問(wèn)題來(lái)自Matplotlib在繪圖中繪制對(duì)象的方式。Matplotlib按繪制對(duì)象的順序?qū)?duì)象按層繪制。因?yàn)槟阍谛行侵皠?chuàng)造了太陽(yáng), Sun 對(duì)象放在第一位 solar_system.bodies 并作為底層繪制。您可以通過(guò)在行星之后創(chuàng)建太陽(yáng)來(lái)驗(yàn)證這一事實(shí),在這種情況下,您將看到行星總是出現(xiàn)在太陽(yáng)后面。
你會(huì)希望Matplotlib按照正確的順序繪制太陽(yáng)系的天體,從最前的那些天體開始。要實(shí)現(xiàn)這一點(diǎn),您可以對(duì) SolarSystem.bodies 的值為基礎(chǔ)的列表。 x -協(xié)調(diào)每次刷新3D圖形的時(shí)間。下面是如何在 update_all() 方法 SolarSystem :
使用List方法 sort 帶著 key 參數(shù)來(lái)定義要用于排序列表的規(guī)則。這個(gè) lambda 函數(shù)設(shè)置此規(guī)則。在本例中,您使用的值是 position[0] 表示 x -協(xié)調(diào)。因此,每次你打電話 update_all() 在模擬中 while 循環(huán)中,根據(jù)其沿 x -軸心。
運(yùn)行 simple_solar_system.py 現(xiàn)在的腳本如下:
現(xiàn)在,你可以想象行星的軌道,就像它們圍繞太陽(yáng)運(yùn)行一樣。不斷變化的大小顯示了它們的 x -位置,當(dāng)行星在太陽(yáng)后面時(shí),它們被隱藏在視線之外!
最后,你也可以移除軸線和網(wǎng)格,這樣你在模擬中看到的就是太陽(yáng)和行星??梢酝ㄟ^(guò)添加對(duì)Matplotlib的調(diào)用來(lái)做到這一點(diǎn)。 axis() 方法 SolarSystem.draw_all() :
模擬現(xiàn)在看起來(lái)是這樣的:
使用Matplotlib對(duì)Python中的一個(gè)三維太陽(yáng)系進(jìn)行的模擬現(xiàn)在已經(jīng)完成。在下一節(jié)中,您將添加一個(gè)功能,允許您查看 XY -模擬底部的飛機(jī)。這有助于可視化太陽(yáng)系中物體的三維動(dòng)力學(xué)。
在Python的三維太陽(yáng)系模擬中,為了幫助可視化身體的運(yùn)動(dòng),您可以在動(dòng)畫的“地板”上添加一個(gè)2D投影。這個(gè)2D投影將顯示物體在 XY -飛機(jī)。要實(shí)現(xiàn)這一點(diǎn),您需要將另一個(gè)繪圖添加到顯示動(dòng)畫的相同軸上,并且只需在 x -和 y -坐標(biāo)。你可以錨定 z -與圖形底部協(xié)調(diào),使2D投影顯示在動(dòng)畫的地板上。
您可以首先將一個(gè)新參數(shù)添加到 __init__() 方法的 SolarSystem 班級(jí):
新參數(shù) projection_2d ,默認(rèn)為 False ,將允許您在兩個(gè)可視化選項(xiàng)之間切換。如果 projection_2d 是 False 動(dòng)畫將只顯示身體在3D中移動(dòng),沒(méi)有軸和網(wǎng)格,就像你最后看到的結(jié)果一樣。
讓我們開始做一些改變 projection_2d 是 True :
您所做的更改如下:
您還需要在 simple_solar_system.py 打開2D投影:
模擬現(xiàn)在看起來(lái)如下:
的二維投影 XY -平面使它更容易跟隨軌道物體的路徑。
我們將用Python完成另一個(gè)三維太陽(yáng)系的模擬。您將使用已經(jīng)定義的類來(lái)模擬雙星系統(tǒng)。創(chuàng)建一個(gè)名為 binary_star_system.py 創(chuàng)造兩個(gè)太陽(yáng)和兩個(gè)行星:
使用 pip 命令行工具在線下載你需要的第三方庫(kù)。
具體步驟如下:使用pip工具安裝軟件包的命令是:pipinstallsome到package到name。我們現(xiàn)在下載名字為:requests的第三方庫(kù)。在命令行窗口中執(zhí)行下面的命令:pipinstallrequests
這樣 requests 第三方庫(kù)就下載和安裝完成了。
Python由荷蘭數(shù)學(xué)和計(jì)算機(jī)科學(xué)研究學(xué)會(huì)的吉多·范羅蘇姆 于1990 年代初設(shè)計(jì),作為一門叫做ABC語(yǔ)言的替代品。Python提供了高效的高級(jí)數(shù)據(jù)結(jié)構(gòu),還能簡(jiǎn)單有效地面向?qū)ο缶幊獭?/p>
python的內(nèi)置函數(shù)(68個(gè))
Python考核31個(gè)內(nèi)置函數(shù),
python內(nèi)置了很多內(nèi)置函數(shù)、類方法屬性及各種模塊。當(dāng)我們想要當(dāng)我們想要了解某種類型有哪些屬性方法以及每種方法該怎么使用時(shí),我們可以使用dir()函數(shù)和help()函數(shù)在python idle交互式模式下獲得我們想要的信息。
? dir()函數(shù)獲得對(duì)象中可用屬性的列表
Python中的關(guān)鍵詞有哪些?
dir(__builtins__):查看python內(nèi)置函數(shù)
help(‘keywords‘):查看python關(guān)鍵詞
如微分積分方程的求解程序、訪問(wèn)互聯(lián)網(wǎng)、獲取日期和時(shí)間、機(jī)器學(xué)習(xí)算法等。這些程序往往被收入程序庫(kù)中,構(gòu)成程序庫(kù)。
只有經(jīng)過(guò)嚴(yán)格檢驗(yàn)的程序才能放在程序庫(kù)里。檢驗(yàn),就是對(duì)程序作充分的測(cè)試。通常進(jìn)行的有正確性測(cè)試、精度測(cè)試、速度測(cè)試、邊界條件和出錯(cuò)狀態(tài)的測(cè)試。經(jīng)過(guò)檢驗(yàn)的程序不但能保證計(jì)算結(jié)果的正確性,而且對(duì)錯(cuò)誤調(diào)用也能作出反應(yīng)。程序庫(kù)中的程序都是規(guī)范化的。所謂規(guī)范化有三重含義:①同一庫(kù)里所有程序的格式是統(tǒng)一的;② 對(duì)這些程序的調(diào)用方法是相同的;③ 每個(gè)程序所需參數(shù)的數(shù)目、順序和類型都是嚴(yán)格規(guī)定好的。
Python的庫(kù)包含標(biāo)準(zhǔn)庫(kù)和第三方庫(kù)
標(biāo)準(zhǔn)庫(kù):程序語(yǔ)言自身?yè)碛械膸?kù),可以直接使用。help('modules')
第三方庫(kù):第三方者使用該語(yǔ)言提供的程序庫(kù)。
標(biāo)準(zhǔn)庫(kù): turtle 庫(kù)(必選)、 random 庫(kù)(必選)、 time 庫(kù)(可選)。
? turtle 庫(kù):圖形繪制庫(kù)
原理如同控制一只海龜,以不同的方向和速度進(jìn)行位移而得到其運(yùn)動(dòng)軌跡。
使用模塊的幫助時(shí),需要先將模塊導(dǎo)入。
例如:在IDLE中輸入import turtle
dir(turtle)
help(turtle.**)
1.畫布
畫布就是turtle為我們展開用于繪圖區(qū)域, 我們可以設(shè)置它的大小和初始位置。
setup()方法用于初始化畫布窗口大小和位置,參數(shù)包括畫布窗口寬、畫布窗口高、窗口在屏幕的水平起始位置和窗口在屏幕的垂直起始位置。
參數(shù):width, height: 輸入寬和高為整數(shù)時(shí),表示 像素 ;為小數(shù)時(shí),表示占據(jù)電腦屏幕的比例。(startx,starty):這一坐標(biāo)表示
矩形窗口左上角頂點(diǎn)的位置,如果為空,則窗口位于屏幕中心:
例如:setup(640,480,300,300)表示在桌面屏幕(300,300)位置開始創(chuàng)建640×480大小的畫布窗體。
2、畫筆
? color() 用于設(shè)置或返回畫筆顏色和填充顏色。
例如:color(‘red’)將顏色設(shè)為紅色,也可用fillcolor()方法設(shè)置或返回填充顏色,或用pencolor()方法設(shè)置或返回筆觸顏色。
C++,Java和Python是競(jìng)爭(zhēng)性編程的三種最常見的語(yǔ)言。在本文中,我們將從競(jìng)爭(zhēng)性編程和面試準(zhǔn)備的角度重點(diǎn)介紹最重要的Python模塊。
?
list:動(dòng)態(tài)大小的數(shù)組,允許在不關(guān)心數(shù)組大小的情況下進(jìn)行插入和刪除。它還具有普通數(shù)組的優(yōu)點(diǎn),例如隨機(jī)訪問(wèn)和緩存友好性。list也可以用作隊(duì)列和堆棧。
deque:Dequeue支持在O(1)時(shí)間內(nèi)在兩端進(jìn)行插入和刪除。由于它是使用數(shù)組實(shí)現(xiàn)的,因此它也允許隨機(jī)訪問(wèn)。我們可以使用dequeue來(lái)實(shí)現(xiàn)隊(duì)列和堆棧。關(guān)于Deque的示例問(wèn)題是,訪問(wèn)所有的汽油泵和所有大小為k的子陣列的最大值。
請(qǐng)注意,Python中沒(méi)有用于隊(duì)列(Queue)和堆棧(Stack)的模塊。我們可以使用列表(list)或雙端隊(duì)列(deque)來(lái)實(shí)現(xiàn)這些。首選雙端隊(duì)列(deque)實(shí)現(xiàn),尤其是對(duì)于隊(duì)列,因?yàn)樵诹斜砬懊孢M(jìn)行插入/刪除很慢。
在我們希望具有FIFO項(xiàng)目順序的情況下,隊(duì)列(Queue)很有用。問(wèn)題示例包括:用給定的數(shù)字生成數(shù)字,流中的第一個(gè)非重復(fù)字符,樹及其變體的級(jí)序遍歷,圖的BFS及其變體。
set和dict:它們都實(shí)現(xiàn)了哈希。當(dāng)我們有鍵的集合時(shí),我們使用set。當(dāng)我們有鍵值對(duì)時(shí),我們使用字典(dictionary)。當(dāng)我們希望快速搜索、插入和刪除時(shí)非常有用(這三個(gè)操作都是O(1))。這是業(yè)界使用最多的數(shù)據(jù)結(jié)構(gòu)之一,也是學(xué)術(shù)界最低估的數(shù)據(jù)結(jié)構(gòu)之一。常見的問(wèn)題有:離散元素的計(jì)數(shù)、數(shù)組項(xiàng)的頻率、零和子陣、兩個(gè)未排序數(shù)組的并集、交集等。
heapq:默認(rèn)情況下實(shí)現(xiàn)Min Heap。我們也可以創(chuàng)建最小堆。只要我們希望有效地找到最小或最大元素,就使用它。它用于實(shí)現(xiàn)流行的算法,例如Prim算法,Dijkstra最短路徑,霍夫曼編碼,K個(gè)最大元素,購(gòu)買和合并K個(gè)排序數(shù)組的最大玩具,流的中位數(shù)。
sorted:對(duì)列表等序列進(jìn)行排序?;谂判虻氖纠龁?wèn)題包括:合并重疊間隔,所需的最小平臺(tái)。第K個(gè)最小元素,求給定和的三元組。
bisect:用于二進(jìn)制搜索?;诙M(jìn)制搜索的示例問(wèn)題有:查找第一次出現(xiàn)的索引、計(jì)數(shù)出現(xiàn)次數(shù)、峰值元素、兩個(gè)排序數(shù)組的中值。
注意:與C++ STL和Java集合(Collections)不同。Python標(biāo)準(zhǔn)庫(kù)包含自平衡BST的實(shí)現(xiàn)。在Python中,我們可以使用bisect模塊來(lái)保留一組排序后的數(shù)據(jù)。我們還可以使用PyPi模塊,例如rbtree(紅黑樹的實(shí)現(xiàn))和pyavl(AVL樹的實(shí)現(xiàn))。
1、創(chuàng)建一般的多維數(shù)組
import?numpy?as?np
a?=?np.array([1,2,3],?dtype=int)??#?創(chuàng)建1*3維數(shù)組???array([1,2,3])
type(a)??#?numpy.ndarray類型
a.shape??#?維數(shù)信息(3L,)
a.dtype.name???#?'int32'
a.size???#?元素個(gè)數(shù):3
a.itemsize??#每個(gè)元素所占用的字節(jié)數(shù)目:4
b=np.array([[1,2,3],[4,5,6]],dtype=int)??#?創(chuàng)建2*3維數(shù)組??array([[1,2,3],[4,5,6]])
b.shape??#?維數(shù)信息(2L,3L)
b.size???#?元素個(gè)數(shù):6
b.itemsize???#?每個(gè)元素所占用的字節(jié)數(shù)目:4
c=np.array([[1,2,3],[4,5,6]],dtype='int16')??#?創(chuàng)建2*3維數(shù)組??array([[1,2,3],[4,5,6]],dtype=int16)
c.shape??#?維數(shù)信息(2L,3L)
c.size???#?元素個(gè)數(shù):6
c.itemsize???#?每個(gè)元素所占用的字節(jié)數(shù)目:2
c.ndim??#?維數(shù)
d=np.array([[1,2,3],[4,5,6]],dtype=complex)????#??復(fù)數(shù)二維數(shù)組
d.itemsize??#?每個(gè)元素所占用的字節(jié)數(shù)目:16
d.dtype.name??#?元素類型:'complex128'
2、創(chuàng)建一般的多維數(shù)組
import?numpy?as?np
a?=?np.array([1,2,3],?dtype=int)??#?創(chuàng)建1*3維數(shù)組???array([1,2,3])
type(a)??#?numpy.ndarray類型
a.shape??#?維數(shù)信息(3L,)
a.dtype.name???#?'int32'
a.size???#?元素個(gè)數(shù):3
a.itemsize??#每個(gè)元素所占用的字節(jié)數(shù)目:4
b=np.array([[1,2,3],[4,5,6]],dtype=int)??#?創(chuàng)建2*3維數(shù)組??array([[1,2,3],[4,5,6]])
b.shape??#?維數(shù)信息(2L,3L)
b.size???#?元素個(gè)數(shù):6
b.itemsize???#?每個(gè)元素所占用的字節(jié)數(shù)目:4
c=np.array([[1,2,3],[4,5,6]],dtype='int16')??#?創(chuàng)建2*3維數(shù)組??array([[1,2,3],[4,5,6]],dtype=int16)
c.shape??#?維數(shù)信息(2L,3L)
c.size???#?元素個(gè)數(shù):6
c.itemsize???#?每個(gè)元素所占用的字節(jié)數(shù)目:2
c.ndim??#?維數(shù)
d=np.array([[1,2,3],[4,5,6]],dtype=complex)????#??復(fù)數(shù)二維數(shù)組
d.itemsize??#?每個(gè)元素所占用的字節(jié)數(shù)目:16
d.dtype.name??#?元素類型:'complex128'
3、創(chuàng)建特殊類型的多維數(shù)組
a1?=?np.zeros((3,4))????#?創(chuàng)建3*4全零二維數(shù)組
輸出:
array([[?0.,??0.,??0.,??0.],
[?0.,??0.,??0.,??0.],
[?0.,??0.,??0.,??0.]])
a1.dtype.name???#?元素類型:'float64'
a1.size??#?元素個(gè)數(shù):12
a1.itemsize??#?每個(gè)元素所占用的字節(jié)個(gè)數(shù):8
a2?=?np.ones((2,3,4),?dtype=np.int16)??#?創(chuàng)建2*3*4全1三維數(shù)組
a2?=?np.ones((2,3,4),?dtype='int16')?????#?創(chuàng)建2*3*4全1三維數(shù)組
輸出:
array([[[1,?1,?1,?1],
[1,?1,?1,?1],
[1,?1,?1,?1]],
[[1,?1,?1,?1],
[1,?1,?1,?1],
[1,?1,?1,?1]]],?dtype=int16)
a3?=?np.empty((2,3))??#?創(chuàng)建2*3的未初始化二維數(shù)組
輸出:(may?vary)
array([[?1.,??2.,??3.],
[?4.,??5.,??6.]])
a4?=?np.arange(10,30,5)???#?初始值10,結(jié)束值:30(不包含),步長(zhǎng):5
輸出:array([10,?15,?20,?25])
a5?=?np.arange(0,2,0.3)????#?初始值0,結(jié)束值:2(不包含),步長(zhǎng):0.2
輸出:array([?0.?,??0.3,??0.6,??0.9,??1.2,??1.5,??1.8])
from?numpy?import?pi
np.linspace(0,?2,?9)???#?初始值0,結(jié)束值:2(包含),元素個(gè)數(shù):9
輸出:
array([?0.??,??0.25,??0.5?,??0.75,??1.??,??1.25,??1.5?,??1.75,??2.??])
x?=?np.linspace(0,?2*pi,?9)
輸出:
array([?0.????????,??0.78539816,??1.57079633,??2.35619449,??3.14159265,
3.92699082,??4.71238898,??5.49778714,??6.28318531])
a?=?np.arange(6)
輸出:
array([0,?1,?2,?3,?4,?5])
b?=?np.arange(12).reshape(4,3)
輸出:
array([[?0,??1,??2],
[?3,??4,??5],
[?6,??7,??8],
[?9,?10,?11]])
c?=?np.arange(24).reshape(2,3,4)
輸出:
array([[[?0,??1,??2,??3],
[?4,??5,??6,??7],
[?8,??9,?10,?11]],
[[12,?13,?14,?15],
[16,?17,?18,?19],
[20,?21,?22,?23]]])
使用numpy.set_printoptions可以設(shè)置numpy變量的打印格式
在ipython環(huán)境下,使用help(numpy.set_printoptions)查詢使用幫助和示例
4、多維數(shù)組的基本操作
加法和減法操作要求操作雙方的維數(shù)信息一致,均為M*N為數(shù)組方可正確執(zhí)行操作。
a?=?np.arange(4)
輸出:
array([0,?1,?2,?3])
b?=?a**2
輸出:
array([0,?1,?4,?9])
c?=?10*np.sin(a)
輸出:
array([?0.????????,??8.41470985,??9.09297427,??1.41120008])
n??35
輸出:
array([?True,??True,??True,??True],?dtype=bool)
A?=?np.array([[1,1],[0,1]])
B?=?np.array([[2,0],[3,4]])
C?=?A?*?B????#?元素點(diǎn)乘
輸出:
array([[2,?0],
[0,?4]])
D?=?A.dot(B)???#?矩陣乘法
輸出:
array([[5,?4],
[3,?4]])
E?=?np.dot(A,B)???#?矩陣乘法
輸出:
array([[5,?4],
[3,?4]])
多維數(shù)組操作過(guò)程中的類型轉(zhuǎn)換
When operating with arrays of different types, the type of the
resulting array corresponds to the more general or precise one (a
behavior known as upcasting)
即操作不同類型的多維數(shù)組時(shí),結(jié)果自動(dòng)轉(zhuǎn)換為精度更高類型的數(shù)組,即upcasting
數(shù)組索引、切片和迭代
a?=?np.ones((2,3),dtype=int)??????#?int32
b?=?np.random.random((2,3))?????#?float64
b?+=?a??#?正確?
a?+=?b??#?錯(cuò)誤
a?=?np.ones(3,dtype=np.int32)
b?=?np.linspace(0,pi,3)
c?=?a?+?b
d?=?np.exp(c*1j)
輸出:
array([?0.54030231+0.84147098j,?-0.84147098+0.54030231j,
-0.54030231-0.84147098j])
d.dtype.name
輸出:
'complex128'
多維數(shù)組的一元操作,如求和、求最小值、最大值等
a?=?np.random.random((2,3))
a.sum()
a.min()
a.max()
b?=?np.arange(12).reshape(3,4)
輸出:
array([[?0,??1,??2,??3],
[?4,??5,??6,??7],
[?8,??9,?10,?11]])
b.sum(axis=0)????#?按列求和
輸出:
array([12,?15,?18,?21])
b.sum(axis=1)????#?按行求和
輸出:
array([?6,?22,?38])
b.cumsum(axis=0)???#?按列進(jìn)行元素累加
輸出:
array([[?0,??1,??2,??3],
[?4,??6,??8,?10],
[12,?15,?18,?21]])
b.cumsum(axis=1)???#?按行進(jìn)行元素累加
輸出:
array([[?0,??1,??3,??6],
[?4,??9,?15,?22],
[?8,?17,?27,?38]])
universal functions
B?=?np.arange(3)
np.exp(B)
np.sqrt(B)
C?=?np.array([2.,-1.,4.])
np.add(B,C)
其他的ufunc函數(shù)包括:
all,?any,?apply_along_axis,?argmax,?argmin,?argsort,?average,?bincount,?ceil,?clip,?conj,?corrcoef,?cov,?cross,?cumprod,?cumsum,?diff,?dot,?floor,inner,?lexsort,?max,?maximum,?mean,?median,?min,?minimum,?nonzero,?outer,?prod,?re,?round,?sort,?std,?sum,?trace,?transpose,?var,vdot,?vectorize,?where
5. 數(shù)組索引、切片和迭代
a?=?np.arange(10)**3
a[2]
a[2:5]
a[::-1]?#?逆序輸出
for?i?in?a:
print?(i**(1/3.))
def?f(x,y):
return?10*x+y
b?=?np.fromfunction(f,(5,4),dtype=int)
b[2,3]
b[0:5,1]
b[:,1]
b[1:3,:]
b[-1]
c?=?np.array([[[0,1,2],[10,11,12]],[[100,101,102],[110,111,112]]])
輸出:
array([[[??0,???1,???2],
[?10,??11,??12]],
[[100,?101,?102],
[110,?111,?112]]])
c.shape
輸出:
(2L,?2L,?3L)
c[0,...]
c[0,:,:]
輸出:
array([[?0,??1,??2],
[10,?11,?12]])
c[:,:,2]
c[...,2]
輸出:
array([[??2,??12],
[102,?112]])
for?row?in?c:
print(row)
for?element?in?c.flat:
print(element)
a?=?np.floor(10*np.random.random((3,4)))
輸出:
array([[?3.,??9.,??8.,??4.],
[?2.,??1.,??4.,??6.],
[?0.,??6.,??0.,??2.]])
a.ravel()
輸出:
array([?3.,??9.,??8.,?...,??6.,??0.,??2.])
a.reshape(6,2)
輸出:
array([[?3.,??9.],
[?8.,??4.],
[?2.,??1.],
[?4.,??6.],
[?0.,??6.],
[?0.,??2.]])
a.T
輸出:
array([[?3.,??2.,??0.],
[?9.,??1.,??6.],
[?8.,??4.,??0.],
[?4.,??6.,??2.]])
a.T.shape
輸出:
(4L,?3L)
a.resize((2,6))
輸出:
array([[?3.,??9.,??8.,??4.,??2.,??1.],
[?4.,??6.,??0.,??6.,??0.,??2.]])
a.shape
輸出:
(2L,?6L)
a.reshape(3,-1)
輸出:
array([[?3.,??9.,??8.,??4.],
[?2.,??1.,??4.,??6.],
[?0.,??6.,??0.,??2.]])
詳查以下函數(shù):
ndarray.shape,?reshape,?resize,?ravel
6. 組合不同的多維數(shù)組
a?=?np.floor(10*np.random.random((2,2)))
輸出:
array([[?5.,??2.],
[?6.,??2.]])
b?=?np.floor(10*np.random.random((2,2)))
輸出:
array([[?0.,??2.],
[?4.,??1.]])
np.vstack((a,b))
輸出:
array([[?5.,??2.],
[?6.,??2.],
[?0.,??2.],
[?4.,??1.]])
np.hstack((a,b))
輸出:
array([[?5.,??2.,??0.,??2.],
[?6.,??2.,??4.,??1.]])
from?numpy?import?newaxis
np.column_stack((a,b))
輸出:
array([[?5.,??2.,??0.,??2.],
[?6.,??2.,??4.,??1.]])
a?=?np.array([4.,2.])
b?=?np.array([2.,8.])
a[:,newaxis]
輸出:
array([[?4.],
[?2.]])
b[:,newaxis]
輸出:
array([[?2.],
[?8.]])
np.column_stack((a[:,newaxis],b[:,newaxis]))
輸出:
array([[?4.,??2.],
[?2.,??8.]])
np.vstack((a[:,newaxis],b[:,newaxis]))
輸出:
array([[?4.],
[?2.],
[?2.],
[?8.]])
np.r_[1:4,0,4]
輸出:
array([1,?2,?3,?0,?4])
np.c_[np.array([[1,2,3]]),0,0,0,np.array([[4,5,6]])]
輸出:
array([[1,?2,?3,?0,?0,?0,?4,?5,?6]])
詳細(xì)使用請(qǐng)查詢以下函數(shù):
hstack,?vstack,?column_stack,?concatenate,?c_,?r_
7. 將較大的多維數(shù)組分割成較小的多維數(shù)組
a?=?np.floor(10*np.random.random((2,12)))
輸出:
array([[?9.,??7.,??9.,?...,??3.,??2.,??4.],
[?5.,??3.,??3.,?...,??9.,??7.,??7.]])
np.hsplit(a,3)
輸出:
[array([[?9.,??7.,??9.,??6.],
[?5.,??3.,??3.,??1.]]),?array([[?7.,??2.,??1.,??6.],
[?7.,??5.,??0.,??2.]]),?array([[?9.,??3.,??2.,??4.],
[?3.,??9.,??7.,??7.]])]
np.hsplit(a,(3,4))
輸出:
[array([[?9.,??7.,??9.],
[?5.,??3.,??3.]]),?array([[?6.],
[?1.]]),?array([[?7.,??2.,??1.,?...,??3.,??2.,??4.],
[?7.,??5.,??0.,?...,??9.,??7.,??7.]])]
實(shí)現(xiàn)類似功能的函數(shù)包括:
hsplit,vsplit,array_split
8. ?多維數(shù)組的復(fù)制操作
a?=?np.arange(12)
輸出:
array([?0,??1,??2,?...,??9,?10,?11])
not?copy?at?all
b?=?a
b?is?a????#?True
b.shape?=?3,4
a.shape??#?(3L,4L)
def?f(x)???#?Python?passes?mutable?objects?as?references,?so?function?calls?make?no?copy.
print(id(x))???#?id是python對(duì)象的唯一標(biāo)識(shí)符
id(a)???#?111833936L
id(b)???#?111833936L
f(a)?????#?111833936L
淺復(fù)制
c?=?a.view()
c?is?a???#?False
c.base?is?a???#?True
c.flags.owndata????#?False
c.shape?=?2,6
a.shape???#?(3L,4L)
c[0,4]?=?1234
print(a)
輸出:
array([[???0,????1,????2,????3],
[1234,????5,????6,????7],
[???8,????9,???10,???11]])
s?=?a[:,1:3]
s[:]?=?10
print(a)
輸出:
array([[???0,???10,???10,????3],
[1234,???10,???10,????7],
[???8,???10,???10,???11]])
深復(fù)制
d?=?a.copy()
d?is?a???#?False
d.base?is?a???#?False
d[0,0]?=?9999
print(a)
輸出:
array([[???0,???10,???10,????3],
[1234,???10,???10,????7],
[???8,???10,???10,???11]])
numpy基本函數(shù)和方法一覽
Array ? Creation
arange,?array,?copy,?empty,?empty_like,?eye,?fromfile,?fromfunction,?identity,?linspace,?logspace,?mgrid,?ogrid,?ones,?ones_like,?r,?zeros,zeros_like
Conversions
ndarray.astype,?atleast_1d,?atleast_2d,?atleast_3d,?mat
Manipulations
array_split,?column_stack,?concatenate,?diagonal,?dsplit,?dstack,?hsplit,?hstack,?ndarray.item,?newaxis,?ravel,?repeat,?reshape,?resize,squeeze,?swapaxes,?take,?transpose,?vsplit,?vstack
Questionsall,?any,?nonzero,?where
Ordering
argmax,?argmin,?argsort,?max,?min,?ptp,?searchsorted,?sort
Operations
choose,?compress,?cumprod,?cumsum,?inner,?ndarray.fill,?imag,?prod,?put,?putmask,?real,?sum
Basic Statistics
cov,?mean,?std,?var
Basic Linear Algebra
cross,?dot,?outer,?linalg.svd,?vdot
完整的函數(shù)和方法一覽表鏈接: