我想繪製Matplotlib中由零到處組成的曲面,除了以(0,0)爲中心的矩形區域,邊(Dx,Dy)由1組成的 - 一種像桌子一樣,如果你願意;我可以使用plot_surface
命令來做到這一點,不用擔心。我還想在「x」和「y」方向上繪製它的投影(如this demo),結果變得很奇怪:Python似乎是插值我的幅度值(同樣應該是零或一)用於輪廓圖並顯示一些線條,其值與我的數據點不相符。用plot_surface繪製錯誤值的Python輪廓
這是我在做什麼:
import numpy
from matplotlib import pylab
from mpl_toolkits.mplot3d import axes3d
Dx = 1. # Define the sides of the rectangle
Dy = 2.
x_2D = numpy.linspace(-Dx, Dx, 100) # Create the mesh points
y_2D = numpy.linspace(-Dy, Dy, 100)
x_mesh, y_mesh = numpy.meshgrid(x_2D, y_2D)
rect_2D = numpy.zeros(x_mesh.shape) # All values of "rect_2D" are zero...
for i in range(x_2D.size):
for j in range(y_2D.size):
if numpy.abs(x_mesh[i, j]) <= Dx/2 and numpy.abs(y_mesh[i, j]) <= Dy/2:
rect_2D[i, j] = 1. # ... except these ones
fig = pylab.figure(figsize=(9, 7))
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(x_mesh, y_mesh, rect_2D, alpha=0.3)
ax.contour(x_mesh, y_mesh, rect_2D, zdir='x', offset=-1.5, cmap=pylab.cm.brg)
ax.contour(x_mesh, y_mesh, rect_2D, zdir='y', offset=3, cmap=pylab.cm.brg)
ax.set_xlim(-1.5, 1.5)
ax.set_ylim(-3, 3)
ax.set_zlim(0., 1.5)
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')
得出的數據與幅度深綠色線略低於0.8雙方的「X」和「Y」的預測,不存在中我的「rect_2D」變量。有誰知道這是一個錯誤還是我的代碼中有錯誤?有關如何擺脫它的任何建議?提前致謝!
您可能想知道,一個numpy代碼可以運行矢量化,並且比**嵌套循環**執行速度快得多。從36300+ [usec]下降到340 [usec] **使處理恕我直言的速度超過100倍值得一提。** Vectorised numpy語法看起來就是這樣:**'rect_2D [:,:] = 1 *((numpy .abs(x_mesh)<= DxHalf)*(numpy.abs(y_mesh)<= DyHalf))** ** – user3666197 2014-10-07 18:54:18
感謝user3666197,這的確值得一提!我記得每次都嘗試使用向量化的代碼,但是舊的習慣很難實現! – 2014-10-08 15:00:08