ZeroDivisionError:在表面绘图代码中浮点除零



我已经得到了这个代码来生成一个表面图。但除法误差为零。我不知道出了什么问题。谢谢你!

import pylab, csv
import numpy
from mayavi.mlab import *
def getData(fileName):
    try:
        data = csv.reader(open(fileName,'rb'))
    except:
        print 'File not found'
    else:
        data = [[float(row[0]), float(row[1]),float(row[2])] for row in data]
        x = [row[0] for row in data]
        y = [row[1] for row in data]
        z = [row[2] for row in data]
    return (x, y, z)
def plotData(fileName):
    xVals, yVals, zVals = getData(fileName)
    xVals = pylab.array(xVals)   
    yVals = pylab.array(yVals)
    zVals = (pylab.array(zVals)*10**3)
    x, y = numpy.mgrid[-0.5:0.5:0.001, -0.5:0.5:0.001]  
    s = surf(x, y, zVals)
    return s
plotData('data')   

如果我正确理解了代码,那么mayavi.mlab.surf中的zVals存在问题。

根据函数的文档,s是高程矩阵,一个二维数组,其中沿数组第一轴的索引表示x个位置,沿数组第二轴的索引表示y个位置。你的文件阅读器似乎返回一个1D向量,而不是一个数组。

然而,这可能不是最困难的问题。您的文件似乎包含x, y和z坐标的三元组。只有当文件中的x和y坐标形成规则的方形网格时,才能使用mayavi.mlab.surf。如果是这样的话,那么你只需要恢复这个网格,并将这三个部分组成漂亮的二维数组。如果点在文件中的顺序是已知的,则很容易,否则就相当棘手了。

也许你想从mayavi.mlab.points3d(xVals, yVals, zVals)开始。这将使您对数据有一个总体印象。(或者如果你已经对你的数据有了更多的了解,你可以通过编辑你的问题和添加更多的信息来给我们一个提示!)


只是为了让您了解可能有点python风格的编写方式,您的代码被重写(并替换了surf)如下所示:

import mayavi.mlab as ml
import numpy
def plot_data(filename):
    data = numpy.loadtxt(filename)
    xvals = data[:,0]
    yvals = data[:,1]
    zvals = data[:,2] * 1000.
    return ml.points3d(x, y, z)
plot_data('data')   

(重要的改变:使用numpy.loadtxt,去掉这里的pylab命名空间,没有import *,没有CamelCase变量或函数名。)有关详细信息,请参见PEP 8。)


如果你只需要看曲面的形状,并且文件中的数据是逐行排列的,每一行的数据点数相同(即固定的列数),那么你可以使用:

import mayavi.mlab as ml
import numpy
importt matplotlib.pyplot as plt
# whatever you have as the number of points per row
columns = 13
data = numpy.loadtxt(filename)
# draw the data points into a XY plane to check that they really for a rectangular grid:
plt.plot(data[:,0], data[:,1])
# draw the surface
zvals = data[:,2].reshape(-1,columns)
ml.surf(zvals, warp_scale='auto')
如您所见,这段代码允许您检查您的值是否确实在正确的网格类型中。它不会检查它们的顺序是否正确,但至少你可以看到它们形成了一个漂亮的网格。此外,您必须手动输入列的数量。关键字warp_scale负责表面缩放,使其看起来合理。

相关内容

  • 没有找到相关文章

最新更新