我试图在我的数据集中选择一个值的特定事件,但一直遇到一个问题,即将值转换为字符串并循环遍历它们。我的代码如下:
data = np.genfromtxt('DurhamAirMass.txt')
spot = data[:,1]
mass = str(data[:,2])
DP = np.array([])
DT = np.array([])
MP = np.array([])
MT = np.array([])
TR = np.array([])
for i in range(1461):
if mass[i] == '2':
DP = np.append(DP, str(spot[i]))
if mass[i] == '3':
DT = np.append(DT, str(spot[i]))
if mass[i] == '5':
MP = np.append(MP, str(spot[i]))
if mass[i] == '6' or '66' or '67':
MT = np.append(MT, str(spot[i]))
if mass[i] == '7':
TR = np.append(TR, str(spot[i]))
print DP
当我尝试打印出DP数组时,我收到一个指向第一个if语句的错误,并说" IndexError:字符串索引超出范围"。有什么想法吗?
答案 0 :(得分:2)
将data[:,2]
转换为字符串的目的是什么?
顺便说一句。 or
无法正常工作,你必须重复`mass [i] ==``
为什么不:
data = np.genfromtxt('DurhamAirMass.txt')
mass = data[:, 1]
spot = data[:, 2]
DP = mass[spot == 2]
DT = mass[spot == 3]
MP = mass[spot == 5]
MT = mass[(spot == 6)||(spot == 66)||(spot == 67)]
TR = mass[spot == 7]
答案 1 :(得分:0)
您确实导致IndexError
尝试检查spot
以查看其大小,我的猜测是1461
大于其范围,或许您可以尝试将for
循环设置为:
for i in range(len(spot)):
...
相反,这样可以确保您只能访问spot
的有效索引,如果这仍然导致问题,请尝试mass
for i in range(len(mass)):
...
您还可以添加一项检查,以确保数据是您认为的数据。
print len(mass), len(spot), len(spot) == len(mass)
在出现错误的情况下,仔细检查您的假设始终是一种好习惯。在这种情况下,您明确被告知存在IndexError
,因此下一步是找出导致它的索引。
也许更多信息可以帮到你?
try:
for i in range(len(spot)):
# code as usual
except:
print i
raise e
这将告诉您导致错误的索引。
答案 2 :(得分:0)
作为一般规则,除非您希望将输入迭代器视为输入迭代器的大小/小于硬编码值的错误,否则不应对循环迭代进行硬编码(即便如此,更好的方法来实现这一目标。)
您的代码应该如下所示:
for i in range(len(data)):
...
这将确保您始终只循环实际拥有的数据。
答案 3 :(得分:0)
我只是将所有字符串更改为整数并解决了问题。我认为这不会起作用。谢谢大家的所有答案!