首先,您的程序很慢,因爲您我們正在做大量不必要的工作,建設N
。您正在構建一個70 MB的列表,每次只有幾個字節(256 * 256 * 256 = 16,777,216個附加!)。一個更好的(更快,內存使用效率)的方式來建立p
是使用numpy的字節數組廣播,然後再用p
,使N
:
import numpy as np
a = np.arange(256)
p = a[:,np.newaxis,np.newaxis] * a[np.newaxis,:,np.newaxis] * a[np.newaxis,np.newaxis,:]
N = p.flatten()
其次,更重要的是,你不()正確使用plot_surface。根據docs,X,Y和Z應該是二維數組。 X和Y放置2D網格,Z爲該2D網格上的每個點提供「高度」。如果你想手動設置facecolor,它也應該是一個二維數組。您應該查看文檔中的示例以查找示例。
編輯:
我不知道你的陰謀的目的是什麼樣子,所以讓我們通過MPL demo行走。
進行必要的進口,並創建一個軸對象(你正確地做到這一點):
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
from matplotlib.ticker import LinearLocator, FormatStrFormatter
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure()
ax = fig.gca(projection='3d')
接下來,讓一個X/Y網格和相應的Z.在你的程序中,X,Y和Z是1D 。他們在3D空間中描述一條線,而不是表面。
X = np.arange(-5, 5, 0.25)
Y = np.arange(-5, 5, 0.25)
X, Y = np.meshgrid(X, Y) # <-- returns a 2D grid from initial 1D arrays
R = np.sqrt(X**2 + Y**2)
Z = np.sin(R)
讓我們先畫出最簡單的事情。沒有顏色,默認抗鋸齒,線條等
surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1)
plt.show()
現在添加色彩。請注意,顏色來自Z分量。
surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.jet)
plt.show()
現在手動控制顏色(MPL inspiration)。
colortuple = ('y', 'k') # only use two colors: yellow and black
xlen, ylen = X.shape # get length of
colors = np.empty(X.shape, dtype=str) # make a 2D array of strings
for i in range(xlen):
for j in range(ylen):
index = (i + j) % 2 # alternating 0's and 1's
colors[i,j] = colortuple[index]
surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1,
facecolors=colors)
如果你想基於色彩的一些其他指標,您可以創建自己的顏色表。關於如何做到這一點,有很多回答的問題。
編輯2:
顏色也可以指定爲RGB序列。對於一些像X你紅,綠Y上的描述,你可以這樣做:
xlen, ylen = X.shape
colors = np.zeros((xlen,ylen,3))
jspan = np.linspace(0., 1., ylen)
ispan = np.linspace(0., 1., xlen)
for i in range(xlen):
colors[i,:,0] = jspan
for j in range(ylen):
colors[:,j,1] = ispan
surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, facecolors=colors,)
究竟是什麼錯誤消息? – kmote 2012-01-27 00:00:40
回溯(最近呼叫最後): 文件「C:/Python27/try2.py」,第22行,在 N.append(prob_Skin [i,j,k]) MemoryError ---是錯誤消息 –
2012-01-27 00:01:28
程序的哪個部分會出現內存錯誤?是在你追加到N的時候嗎?如果是這樣,可以通過cm.jet()生成器而不是整個列表N.例如取下線N.append(P [i,j,k]),取而代之,在下一行有N =(p [i,j,k]代表i代表X代表j代表Y代表Z代表K) – 2012-01-27 00:05:18