'浮动'对象是不可取消的

时间:2015-03-10 15:17:38

标签: python numpy itertools netcdf

这就是我得到的:

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文件,这是纬度/经度,读入lan / lot。 它是一个数组,用numpy构建。

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

1 个答案:

答案 0 :(得分:1)

你的问题是当你循环遍历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]