'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 构建。
错在哪里?
我试图将 b
和 v
与 int()
转换为整数,但这没有帮助。
N.where
正在通过 xy
中的值访问我要继续处理的网格上的某个值。如果您需要更多代码或一些情节,请告诉我。
您的问题是,当您遍历 xy 时,l
的每个值都是 xy 列表的单个元素,即元组之一。 l
在循环的第一次迭代中的值为(3.625, 41.435)
,第二次为(3.625, 42.435)
,依此类推。
当您执行 l[b]
时,您会得到 3.625
。当您执行 l[b][b]
时,您尝试获取 3.625
的第一个元素,但它是一个浮点数,因此它没有索引。那会给你一个错误。
换句话说,在循环的第一次迭代中,l
与xy[0]
相同,因此l[0]
与xy[0][0]
相同。在第二次迭代中,l
与 xy[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]
这就是我得到的:
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 构建。
错在哪里?
我试图将 b
和 v
与 int()
转换为整数,但这没有帮助。
N.where
正在通过 xy
中的值访问我要继续处理的网格上的某个值。如果您需要更多代码或一些情节,请告诉我。
您的问题是,当您遍历 xy 时,l
的每个值都是 xy 列表的单个元素,即元组之一。 l
在循环的第一次迭代中的值为(3.625, 41.435)
,第二次为(3.625, 42.435)
,依此类推。
当您执行 l[b]
时,您会得到 3.625
。当您执行 l[b][b]
时,您尝试获取 3.625
的第一个元素,但它是一个浮点数,因此它没有索引。那会给你一个错误。
换句话说,在循环的第一次迭代中,l
与xy[0]
相同,因此l[0]
与xy[0][0]
相同。在第二次迭代中,l
与 xy[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]