'float' 对象不可订阅

'float' object is unsubscriptable

这就是我得到的:

TypeError: 'float' object is unsubscriptable

我就是这么做的:

import numpy as N
import itertools

#I created two lists, containing large amounts of numbers, i.e. 3.465

lx = [3.625, 4.625, ...]
ly = [41.435, 42.435, ...] #The lists are not the same size!

xy = list(itertools.product(lx,ly)) #create a nice "table" of my lists

#that iterttools gives me something like
print xy 
[(3.625, 41.435), (3.625, 42.435), (... , ..), ... ]

print xy[0][0]
print xy[0][1] #that works just fine, I can access the varios values of the tuple in the list


#down here is where the error occurs
#I basically try to access certain points in "lon"/"lat" with values from xy through `b` and `v`with that iteration. lon/lat are read earlier in the script 

b = -1
v = 1

for l in xy:
    b += 1
    idx = N.where(lon==l[b][b])[0][0]
    idy = N.where(lat==l[b][v])[0][0]

lan/lot 已在脚本的前面读取。我正在使用 netCDF 文件,这是 latitude/longitude,读入 lan/lot。 它是一个数组,用 numpy 构建。

错在哪里? 我试图将 bvint() 转换为整数,但这没有帮助。 N.where 正在通过 xy 中的值访问我要继续处理的网格上的某个值。如果您需要更多代码或一些情节,请告诉我。

您的问题是,当您遍历 xy 时,l 的每个值都是 xy 列表的单个元素,即元组之一。 l在循环的第一次迭代中的值为(3.625, 41.435),第二次为(3.625, 42.435),依此类推。

当您执行 l[b] 时,您会得到 3.625。当您执行 l[b][b] 时,您尝试获取 3.625 的第一个元素,但它是一个浮点数,因此它没有索引。那会给你一个错误。

换句话说,在循环的第一次迭代中,lxy[0]相同,因此l[0]xy[0][0]相同。在第二次迭代中,lxy[1] 相同,因此 l[0]xy[1][0] 相同。在第三次迭代中,l 等同于 xy[2],依此类推。所以在第一次迭代中,l[0][0]xy[0][0][0] 相同,但是没有这样的东西所以你得到一个错误。

要获取元组的第一个和第二个值,您可以使用索引方法:

x = l[0]
y = l[1]

或者,在您的情况下:

for l in xy:
    idx = N.where(lon==l[0])[0][0]
    idy = N.where(lat==l[1])[0][0]

但是,最简单的解决方案是使用所谓的 "tuple unpacking":

for x, y in xy:
    idx = N.where(lon==x)[0][0]
    idy = N.where(lat==y)[0][0]

这相当于:

for l in xy:
    x, y = l
    idx = N.where(lon==x)[0][0]
    idy = N.where(lat==y)[0][0]

这又等同于:

for l in xy:
    x = l[0]
    y = l[1]
    idx = N.where(lon==x)[0][0]
    idy = N.where(lat==y)[0][0]