【问题标题】:Python: float() argument must be a string or a number, not 'interp2d'Python:float() 参数必须是字符串或数字,而不是“interp2d”
【发布时间】:2017-03-01 19:39:56
【问题描述】:

此代码返回错误“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:输入数据无效”。这是回溯:

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)

【问题讨论】:

  • 请给出实际的回溯以缩小搜索范围。
  • interp2d doc 声明:“该类返回一个函数,其调用方法使用样条插值来查找新点的值。”所以你在 contourf 需要一个浮点值的地方传递这个函数。
  • @kindall 当我注释掉 contourf 部分时,错误消失了,但没有创建 temp_cubic。所以还是有问题。编辑:我似乎很愚蠢。由于某种原因,我期待一个数组弹出,而不是一个函数。让我改变一下,看看会发生什么,谢谢。
  • 我没有说问题出在contourf 调用本身。问题是 contourf 调用需要一个数字作为其第三个参数,而您正在给它一个函数。
  • 欢迎来到 StackOverflow。请阅读并遵循帮助文档中的发布指南。 Minimal, complete, verifiable example 适用于此。在您发布代码并准确描述问题之前,我们无法有效地帮助您。具体来说,发布一个重现问题的示例,并提供完整的错误消息。这将包括追溯。

标签: python numpy scipy spyder netcdf


【解决方案1】:

问题出在下面一行。 interp2d 返回一个插值函数。但是,您使用它代替了 countourfZ 参数,它应该是一个浮点矩阵。详情请见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 显示我的其他可能性的概念错误。

【讨论】:

  • 你绝对是对的;但是,我更改了它,但仍然出现错误。
  • 如果您有兴趣,请编辑我的帖子
猜你喜欢
  • 1970-01-01
  • 2019-09-24
  • 1970-01-01
  • 2022-01-09
  • 2015-12-03
  • 2013-12-30
  • 2020-04-24
  • 2020-10-04
相关资源
最近更新 更多