ZeroDivisionError:在Surface曲线的代码中浮点除零

时间:2014-06-29 01:22:15

标签: python python-2.7 numpy mayavi

我有这个代码来生成表面图。但它给出了零分割错误。我无法弄清楚出了什么问题。谢谢。

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')   

1 个答案:

答案 0 :(得分:0)

如果我已正确理解代码,则zVals中的mayavi.mlab.surf会出现问题。

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

然而,这可能不是最困难的问题。您的文件似乎包含x,y和z坐标的三元组。仅当文件中的x和y坐标形成正方形网格时,才能使用mayavi.mlab.surf。如果是这种情况,那么您只需恢复该网格并形成所有三个部分的漂亮2D数组。如果这些点以已知顺序存在于文件中,则很容易,否则它会相当棘手。

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


为了让您了解可能稍微有点pythonic的写作风格,您的代码将在下面重写(并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变量或函数名称。有关详细信息,请参阅{{1} }。)


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

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') 负责表面缩放,以使其看起来合理。