Python:float()参数必须是字符串或数字,而不是'interp2d'

时间:2016-10-20 00:37:48

标签: python numpy scipy spyder netcdf

此代码返回错误“float()参数必须是字符串或数字,而不是'interp2d'”。我正在尝试学习如何在给定数组中的一些值的情况下插值来填充数组(抱歉,错误的措辞)。我搞乱了interp2d函数的语法还是什么?

import numpy as np
import matplotlib.pyplot as plt
from netCDF4 import Dataset
import scipy as sp

GCM_file = '/Users/Robert/Documents/Python Scripts/GCMfiles/ATM_echc0003_1979_2008.nc'
fh = Dataset(GCM_file, mode = 'r')

pressure = fh.variables['lev'][:]
lats = fh.variables['lat'][:]
temp = np.mean(fh.variables['t'][0,:,:,:,:], axis = (0, 3))
potential_temp = np.zeros((np.size(temp,axis=0), np.size(temp,axis=1)))

P0 = pressure[0] 
#plt.figure(0)
for j in range(0, 96):
    potential_temp[:,j] = temp[:, j] * (P0/ pressure[:]) ** .238


potential_temp_view = potential_temp.view()

temp_view = temp.view()

combo_t_and_pt = np.dstack((potential_temp_view,temp_view))
combo_view = combo_t_and_pt.view()

pt_and_t_flat=np.reshape(combo_view, (26*96,2))
t_flat = temp.flatten()
pt_flat = potential_temp.flatten()

temp_grid = np.zeros((2496,96))

for j in range(0, 2496):
    if j <= 95:
        temp_grid[j,j] = t_flat[j]
    else:
            temp_grid[j, j % 96] = t_flat[j]

'''Now you have the un-interpolated grid of all your values of t as a function of potential temp and latitude, so you have to interpolate the rest somehow....?'''

xlist = lats
ylist = pt_flat

X,Y = np.meshgrid(xlist,ylist)



temp_cubic = sp.interpolate.interp2d(xlist,ylist, temp_grid, kind = 'cubic')
#temp_linear= griddata(temp_grid, (X,Y), method = 'linear')
#temp_quintic = griddata(temp_grid, (X,Y), method = 'cubic')

plt.figure(0)
plt.contourf(X,Y, temp_cubic, 20)

编辑:向我指出了这个错误。我将代码从插值行更改为此,我仍然收到错误,其中显示“ValueError:Invalid input data”。这是追溯:

runfile('C:/Users/Robert/Documents/Python Scripts/attempt at defining potential temperature.py', wdir='C:/Users/Robert/Documents/Python Scripts')
Traceback (most recent call last):
  File "<ipython-input-27-1ffd3fcc3aa1>", line 1, in <module>
    runfile('C:/Users/Robert/Documents/Python Scripts/attempt at defining potential temperature.py', wdir='C:/Users/Robert/Documents/Python Scripts')
  File "C:\Users\Robert\Anaconda3\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 699, in runfile
    execfile(filename, namespace)
  File "C:\Users\Robert\Anaconda3\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 88, in execfile
    exec(compile(open(filename, 'rb').read(), filename, 'exec'), namespace)
  File "C:/Users/Robert/Documents/Python Scripts/attempt at defining potential temperature.py", line 62, in <module>
    Z = temp_cubic(xlist,ylist)
  File "C:\Users\Robert\Anaconda3\lib\site-packages\scipy\interpolate\interpolate.py", line 292, in __call__
    z = fitpack.bisplev(x, y, self.tck, dx, dy)
  File "C:\Users\Robert\Anaconda3\lib\site-packages\scipy\interpolate\fitpack.py", line 1048, in bisplev
    raise ValueError("Invalid input data")":

temp_cubic = sp.interpolate.interp2d(xlist, ylist, temp_grid, kind = 'cubic')

ylist = np.linspace(np.min(pt_flat), np.max(pt_flat), .01)

X,Y = np.meshgrid(xlist,ylist)
Z = temp_cubic(xlist,ylist)
plt.contourf(X,Y, Z, 20)

1 个答案:

答案 0 :(得分:1)

问题出在以下几行。 interp2d返回插值函数。但是,您使用它来代替 countourf Z 参数,它应该是一个浮点矩阵。有关详细信息,请参阅contourf doc

特别是:

contour(X,Y,Z,N)
make a contour plot of an array Z.
X, Y specify the (x, y) coordinates of the surface
X and Y must both be 2-D with the same shape as Z,
  or they must both be 1-D such that
  len(X) is the number of columns in Z and
  len(Y) is the number of rows in Z.
contour up to N automatically-chosen levels.

简而言之,我相信你想将函数应用于X和Y来生成你传入的数组作为第三个参数。

相信matplotlib文档和 kindall ,以显示其他可能性的概念错误。