Axes3D绘图需要花费大量时间并使用大量RAM

时间:2015-10-23 07:27:47

标签: python-2.7 matplotlib

我有以下代码来创建双变量高斯分布的3D图:

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

class Data(object):
    data = None
    columns = 0
    rows = 0

    def __init__(self, path='file.txt'):
        self.data = np.loadtxt(path, delimiter=' ', dtype='float32')
        self.rows, self.columns = self.data.shape

    def _pdf(self, x, mu, cov):
        part1 = 1 / ( ((2* np.pi)**(len(mu)/2)) * (np.linalg.det(cov)**(1/2)) )
        part2 = (-1/2) * ((x-mu).T.dot(np.linalg.inv(cov))).dot((x-mu))
        return float(part1 * np.exp(part2))

    def compute_Z(self):
        mu  = np.array([[2.99413181],[3.05209659]], dtype="float")
        cov = np.array([[1.01023423, 0.02719138], [0.02719138, 2.93782296]], dtype="float")
        Z = []
        for i, j in zip(X, Y):
            x = np.array([i,j]).reshape(2,1)
            Z.append(self._pdf(x, mu, cov))
        return np.array(Z)

if __name__ == "__main__":
    data = Data()
    X = data.data[:, 0]
    Y = data.data[:, 1]
    Z = data.compute_Z()

    X, Y = np.meshgrid(X, Y)
    fig = plt.figure()
    ax = fig.add_subplot(111, projection='3d')
    ax.plot_surface(X, Y, Z, rstride=1, cstride=1, color='0.9', alpha=0.9, linewidth=1)
    plt.show()

但这需要花费大量时间并使用大量内存。有没有办法减少它?或者有更好的方法来创建这个情节?

谢谢!

1 个答案:

答案 0 :(得分:1)

matplotlib 3D绘图对于大量数据不是很好。

您可以使用mayavi,它使用mlab具有非常相似的界面。

from mayavi import mlab

mlab.figure()
mlab.surf(X, Y, Z)
mlab.show()