Python Matplotlib griddata失败

Python Matplotlib griddata失败,python,numpy,matplotlib,Python,Numpy,Matplotlib,我正在尝试编写一个函数,它可以从文本数据文件或格式为x,y,z的numpy数组生成等高线图。但是,当我尝试使用griddata插值数据时,会出现一个类型错误: if not len(x)==len(y)==len(z): TypeError: object of type 'numpy.float64' has no len() 这是我的职责: def ContourPlot(datafile,columns=[0,1,2], nXvals=100, nYvals=100, title

我正在尝试编写一个函数,它可以从文本数据文件或格式为x,y,z的numpy数组生成等高线图。但是,当我尝试使用griddata插值数据时,会出现一个类型错误:

    if not len(x)==len(y)==len(z):
TypeError: object of type 'numpy.float64' has no len()
这是我的职责:

def ContourPlot(datafile,columns=[0,1,2], nXvals=100, nYvals=100, title='', xlab='', ylab='', colormap='rainbow', contours=10):

        if type(datafile)==type(str()):
                try:
                        x, y, z = np.loadtxt(datafile, dtype='float', unpack=True, usecols=columns)
                except:
                        print "Can't open the input file!"
                        exit
        elif type(datafile)==np.ndarray:
                        x = datafile[0]
                        y = datafile[1]
                        z = datafile[2]
        else:
                        print "ERROR: You tried to pass data to the ContourPlot() function in a format it cannot read"
                        exit

        print type(x)

        xi = np.linspace(np.amin(x), np.amax(x), nXvals)
        yi = np.linspace(np.amin(y), np.amax(y), nYvals)
        zi = griddata(x, y, z, xi, yi)
        norm = colors.Normalize(vmin = np.min(z), vmax = np.max(z), clip = False)
        pl.figure()
        pl.contourf(xi, yi, zi, 30, cmap = pl.get_cmap(colormap), norm =norm)
        CS = pl.contour(xi, yi, zi, colors = 'k',lw = 3, levels= contours)
        pl.clabel(CS, inline=1, fontsize=10)
        pl.tick_params(axis='x', labelsize=20)
        pl.tick_params(axis='y', labelsize=20)
        pl.title(title, fontsize=17)
        pl.xlabel(xlab, fontsize=20)
        pl.ylabel(ylab, fontsize=20)
        pl.show()
我尝试用tolist方法将x、y、z转换为常规Python列表,但没有成功


任何帮助都将不胜感激

我想您使用的是旧版本的matplotlib?您从何处导入griddata?查看matplotlib/mlab.py文件中的griddate函数,并查看是否有类似的行

if not len(x)==len(y)==len(z):
    raise TypeError("inputs x,y,z must all be 1D arrays of the same length")
处的当前版本不再具有此行,但现在检查此方式:

# Check input arguments.
x = np.asanyarray(x, dtype=np.float64)
y = np.asanyarray(y, dtype=np.float64)
z = np.asanyarray(z, dtype=np.float64)
if x.shape != y.shape or x.shape != z.shape or x.ndim != 1:
    raise ValueError("x, y and z must be equal-length 1-D arrays")

因此,更新到最新版本可能已经解决了您的问题。在任何情况下,当前至少有一个x、y、z输入为numpy.float64类型,并且由于某些原因没有len。

您能告诉我们您的数据文件的外观吗?它有3列还是3行?这些值是如何分离的?错误是告诉您x、y、z中的一个是浮点,而不是浮点列表。可能是文件读取失败,可能是转换失败。