2017-06-27 158 views
0

我正在使用Spyder接口(Python 2.7)來數值求解PDE。我已經將代碼設置爲U在計算位置和時間的位置。 U是我的代碼中的一個[nxm]矩陣,其中n是位置,m是時間。所以在每個U [n,m]代碼在第m個時間給出第n個位置。有沒有一種方法可以利用這種矩陣在python中創建網格圖。我已經搜索過,但例如numpy的網格只處理數組。謝謝。繪製3D網格:

[[ 1.20643447 1.20520185 1.20397894 ..., 1.04589795 1.04587534 1.04585286] 
[ 1.40901699 1.40658211 1.4041664 ..., 1.09172525 1.09168043 1.09163586] 
[ 1.6039905 1.6004133 1.59686428 ..., 1.13741248 1.13734625 1.1372804 ]..., 
[ 2.3960095 2.3995867 2.40313572 ..., 2.54969453 2.55003659 2.55037764] 
[ 2.59098301 2.59341789 2.57981471 ..., 2.59750546 2.59785406 2.59820163] 
[ 2.79356553 2.74473913 2.71231633 ..., 2.64640578 2.64675767 2.64710852]] 

這些都是很多的價值觀U的殼吐在我身上。正如你所看到的,我將處理600個不同的陣列,因爲矩陣設置爲在特定的時間和位置找到U.共計600步時間。 This is a example of a type of graph that I am trying to reproduce.

+1

是否有一個原因,你不能,之前繪製,矩陣轉換爲數組,用'np.asarray(U)'或'np.array(U)'? – EFT

回答

3

請嘗試使用搜索功能;您可以在Overflow上的繪圖表面上的許多其他線程中找到工作代碼here


我想你可能會在這裏混淆一​​些術語。你有一個對應於二維函數值的值矩陣;這不是一個網格。在matplotlib中,您可以通過多種方式將三維矩陣可視化,通常爲surfacewireframeimage(作爲熱圖)。

功能np.meshgrid()給你N維度指數。你需要這個爲你的nm載體,而不是你的矩陣U,把它們變成與你的矩陣形狀相同的多維陣列。幸運的是,matplotlib並不在乎U是矩陣還是矢量。

例如與np.meshgrid()

>>> t = np.linspace(0,60,6000) 
>>> x = np.linspace(0,2*np.pi,3600) 
>>> T, X = np.meshgrid(t, x) 
>>> t.shape 
(6000,) 
>>> x.shape 
(3600,) 
>>> T.shape 
(3600, 6000) 
>>> X.shape 
(3600, 6000) 

現在創建一個函數U(x,t)

>>> U = np.matrix(x[:, np.newaxis] * t) # broadcast 
>>> U.shape 
(3600, 6000) 

並繪製表面,您可以使用surf功能Axes3Dmatplotlib例如,但您也可以使用上面鏈接的線框或圖像方法。

>>> import matplotlib.pyplot as plt 
>>> import pylab 
>>> from mpl_toolkits.mplot3d import Axes3D 

>>> fig = plt.figure() 
>>> ax = fig.gca(projection='3d') 
>>> surf = ax.plot_surface(X,T,U) 
>>> plt.show() 

Surface plot

+0

所以在我的情況。我可以將U放入三維表面圖中,即使它是二維陣列,它仍然可以工作?因爲在爲X和T設置網格後,我得到了一個形狀不匹配值錯誤。當包括U. –

+0

你可能在陣列中只有'X'和'T'--我並不是特別忠誠於你的陣列。只要像你一樣去打印出形狀,就可以更好地理解numpy形狀之間的關係。起初有點令人困惑,但主要是直覺。你希望meshgrid與你的矩陣形狀相同。 –

+0

你是對的我檢查了U,X和T的形狀,他們沒有正常工作。然後我改變了meshgrid格式,並且完美運行。謝謝你的幫助。 –