Python中的表面图 - MemoryError

时间:2015-07-07 00:59:05

标签: python matplotlib

我尝试使用坐标创建表面图,使用以下代码:

from mpl_toolkits.mplot3d import Axes3D
from scipy.stats import gaussian_kde

fig = plt.figure()
ax = Axes3D(fig)
X = []
Y = []
XY = np.vstack([X, Y])
x, y = np.meshgrid(X, Y)
z = gaussian_kde(XY)(XY).tolist()
ax.plot_surface(x, y, z)
plt.show()

假设X和Y是浮点数的长列表。但是,当我执行代码时,我得到一个MemoryError,它追溯到meshgrid方法:in meshgrid return [x * mult_fact for x in output]

有谁知道如何解决这个问题?

(当我通过编写XY = np.vstack([X[0:10], Y[0:10]])x, y = np.meshgrid(X[0:10], Y[0:10])来改变代码以使用列表的子集时,曲面图可以工作,但重叠。我想这是因为点没有按顺序绘制有谁知道如何解决这个问题?我是Python新手......)

1 个答案:

答案 0 :(得分:1)

你试图绘制太多积分。要看到这个,给你的例子一些假数据:

from mpl_toolkits.mplot3d import Axes3D
from scipy.stats import gaussian_kde
import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure()
ax = Axes3D(fig)

npoints = 100
X = np.linspace(0, 1, npoints)
Y = np.sin(X)
XY = np.vstack([X, Y])
x, y = np.meshgrid(X, Y)
z = gaussian_kde(XY)(XY).tolist()
ax.plot_surface(x, y, z)
plt.show()

这样可以正常工作,但是如果我们npoints=10000那么(在我的机器上)我可以重现你的错误。

解决方案完全取决于XY的确切含义。例如,如果它们是某些测量数据输出,那么您需要提出问题“我是否需要绘制所有这些数据?”。根据我的经验,如果你试图绘制这么多积分而导致内存错误,那么无论如何你都无法看到所有数据!所以,你可以对它进行下采样,只需选择每个n点。首先,我建议将XY转换为numpy数组

import numpy as np
X = np.array(X)
Y = np.array(Y)

然后,每100分做一次:

X = X[::100]
Y = Y[::100]

有关数组切片和索引see the docs的更多信息。

或者您可能会觉得这“丢失”了一些有价值的信息,在这种情况下,您可以应用平均滚动窗口然后单独考虑每个窗口中的变化来检查您没有错过任何内容。最终,它将取决于数据是什么。