【问题标题】:numpy loadtxt IndexError: list index out of rangenumpy loadtxt IndexError:列表索引超出范围
【发布时间】:2021-09-29 22:13:31
【问题描述】:

我是 Python 的新手,目前我有一个如下所示的文本文件:

# Wed 13:10:08 11-Mar-2015
 begin  aperture image1 1 1024. 139.7445
 image  image1
 aperture   1
 beam   1
 center 1024. 139.7445
 low        -1023. -4.
 high   1024. 4.
 background
         xmin -40.45428
         xmax 43.75221
         function chebyshev
         order 3
         sample -40.45428:-18.42313 20.09063:43.75221
         naverage 1
         niterate 0
         low_reject 3.
         high_reject 3.
         grow 0.
 axis    2
 curve   6
         2.
         2.
         4.
         2044.
         -0.1275881
         -0.03320996 

我想从第六行(“中心”)中提取“139.7445”。这是我的代码:

pos_wasp = np.loadtxt(line, skiprows=5, usecols=(3,4), unpack=True)

但是当我运行它时,它给出了一个错误:

IndexError: 列表索引超出范围

这应该是一个简单的问题,我已经尝试多次更改列号和数据类型,但仍然不起作用。

【问题讨论】:

  • np.genfromtxt(line, skip_header=5, skip_footer=21, usecols=(1,2), unpack=True) 将提取array([1024., 139.7445])
  • 我的猜测是索引错误来自usecols值。给我们更多的错误信息(行等)会​​澄清这一点。但更重要的是,这不是 loadtxt/genfromtxt 要处理的那种文件。
  • 这适用于 genfromtxt!谢谢大家的帮助:)

标签: python numpy text


【解决方案1】:

如果您在使用numpy.loadtxt 时对IndexError: list index out of range 感到沮丧后到达此页面,请不要绝望。

失败的原因是输入文本文件中的一行或多行不包含usecols=() 中指定的列。

要更正错误,请检查文本文件中的所有行是否都有您要提取的列。

【讨论】:

  • 我知道问题背后的原因,不想查看包含 400K 数据的每个值。如何用 0 或一些有意义的东西替换缺失值,从而避免此错误。
  • 就是这样。如果 txt 阅读器无法正确解析 csv,则不会按预期组装行。这导致 usecols 值大于某些列的行数。
【解决方案2】:

我认为你的代码失败了,因为loadtxt 想要读取你的值之后的所有行。为了只得到这个值,为什么不直接读取文件(inpp.txt,或任何你的名字):

with open('inpp.txt') as fi:
    for line in fi:
        fields = line.split()
        if fields[0] == 'center':
            val = float(fields[2])
            break

print(val)

【讨论】:

    【解决方案3】:

    文本文件末尾是否有新行?如果是这样,请摆脱它,看看它是否有效。

    【讨论】:

    • 我遇到了同样的问题,删除文本文件末尾的回车符没有帮助。
    【解决方案4】:

    我认为你的代码失败了,因为loadtxt 也想读入你的值之后的所有行。正如@nymk 建议的那样,您可以使用genfromtxt 跳过页脚,但要获得这个值,为什么不直接读取文件:

    with open('inpp.txt') as fi:
        for line in fi:
            fields = line.split()
            if fields[0] == 'center':
                val = float(fields[2])
                break
    
    print(val)
    

    【讨论】:

      【解决方案5】:

      玩了之后,我发现由于某种原因我必须在使用usecols= 时指定delimiter=,即使numpy.loadtxt() 在不使用usecols= 时正确假定了分隔符。所以尝试使用:

      delimiter=" ".

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-10-31
        • 2015-06-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多