首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ZeroDivisionError:曲面图代码中的浮点除法

ZeroDivisionError:曲面图代码中的浮点除法
EN

Stack Overflow用户
提问于 2014-06-29 01:22:14
回答 1查看 4.7K关注 0票数 2

我有这个代码来生成一个曲面图。但是它给出了一个零除法误差。我不知道出了什么问题。谢谢。

代码语言:javascript
复制
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')   
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-29 22:14:47

如果我正确理解了代码,那么zValsmayavi.mlab.surf中就会出现问题。

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

然而,这可能不是最困难的问题。您的文件似乎包含x、y和z坐标的三重奏。只有当文件中的x和y坐标形成正方形网格时,才能使用mayavi.mlab.surf。如果是这样的话,那么您只需恢复网格,并形成良好的2D数组的所有三个部分。如果点在文件中的顺序是已知的,这是容易的,否则它是相当棘手的。

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

为了让您了解一下这一点,您的代码被重写(并替换了surf )如下:

代码语言:javascript
复制
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。)

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

代码语言:javascript
复制
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负责表面缩放,以使其看起来合理。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24472385

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档