【问题标题】:Looping over dataset of strings循环遍历字符串数据集
【发布时间】:2026-02-12 16:15:01
【问题描述】:

我试图在我的数据集中挑选出特定出现的值,但在处理将值转换为字符串并循环它们时一直遇到问题。我的代码如下:

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:字符串索引超出范围”。有什么想法吗?

【问题讨论】:

  • 你知道mass 的长度至少是1461 吗?我认为你的 for 循环应该是 for i in range(len(mass))
  • @aruisdante 我认为这是我遇到问题的地方。字符串的长度不是 1461,这就是我必须循环的数据点数(即我有 1461 个质量和 1461 个点)
  • 做一个print mass 看看,它是什么样子的。
  • @Daniel 它给了我 1461 个不同的数字(即前六个是 [1. 4. 7. 2. 2. 2. ..........]
  • @DJV:不,它为您提供了数组的字符串表示形式,长度约为 80 个字符

标签: python string for-loop


【解决方案1】:

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]

【讨论】:

    【解决方案2】:

    作为一般规则,您永远不应该对 for 循环迭代进行硬编码,除非您希望输入迭代器永远大于/小于硬编码值(即使这样,也有更好的方法来实现这一点)。

    您的代码应该如下所示:

    for i in range(len(data)):
        ...
    

    这将确保您始终只遍历您实际拥有的数据。

    【讨论】:

      【解决方案3】:

      你确实造成了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 
      

      这将告诉您导致错误的索引。

      【讨论】:

      • "spot" 和 "mass" 都有 1461 个值。正如我在上面的评论中所说,我认为程序认为“质量”的长度为 1461 个字符,但事实并非如此。仅有 1461 个质量值。
      • @DJV 好的,但是IndexError 表示您正在尝试访问超出您尝试访问的对象范围的内容。你试过我的建议了吗?
      • @DJV 看到我的编辑,你能提供确切的错误信息吗?也许也是您得到答案的索引?
      【解决方案4】:

      我只是将所有字符串都更改为整数,这解决了问题。起初我不认为这会起作用。谢谢大家的回答!

      【讨论】: