【问题标题】:ZeroDivisionError: float division by zero in a code for Surface plotZeroDivisionError:表面图代码中的浮点除法零
【发布时间】:2014-06-29 01:22:14
【问题描述】:

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

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

【问题讨论】:

  • 你的堆栈跟踪是什么样的?
  • 显示完整的错误信息(回溯) - 有问题的行数。在您的代码中显示这一行。
  • 请注意,通常pylab 用于从ipython 命令行进行交互式绘图。运行脚本时使用matplotlib.pyplot 通常会更好。见docs
  • @drs pylab 只是一个命名空间,它导入了所有的pyplotnumpy,还有一些其他的见stackoverflow.com/questions/16849483/…
  • 此外,您似乎正在使用pylab 作为导入 numpy 然后实际使用 mayavi 进行绘图的一种循环方式。重新标记。

标签: python python-2.7 numpy mayavi


【解决方案1】:

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

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

但是,这可能不是最困难的问题。您的文件似乎包含 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 负责表面缩放,使其看起来合理。

【讨论】:

  • 博士,博士,我仍然遇到同样的错误。我的数据文件代表一个数字生成的粗糙表面。它包含大约一百万个点的 X、Y 和 Z 坐标,并且 X 和 Y 坐标是有序的。/我需要这个图来查看生成的表面。这就是为什么,我使用了 surf() 情节。
  • 您知道网格中每个方向(X 和 Y)的实际点数吗?如果文件是逐行排序的,那就很简单了。
  • @Kalay,请参阅我帖子末尾的编辑。也许这符合您的需要?
猜你喜欢
  • 1970-01-01
  • 2018-03-03
  • 2011-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多