You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用astropy的Table模块删除表格行时出现索引越界错误如何解决

报错原因
  • 索引长度不匹配:你循环的范围是原始FITS表的长度(75000行),但每次执行t.remove_rows(i)后,Table对象t的总行数会同步减少,当循环到的i值大于当前t的总行数时,就会触发越界错误。你遇到的37781越界提示,和原始数据的第37781行本身没有任何关系,只是执行到一半时t已经只剩37780行,i走到37781超出了当前表的索引范围。
  • 逐行删除的逻辑缺陷:哪怕你把循环范围改成当前t的长度,也会出现漏判问题。比如你删除了第2行,原来的第3行会自动前移变成新的第2行,下一轮循环i增加到3时,就会跳过原来的第3行,最终筛选结果不符合要求。
  • 性能开销问题:remove_rows是对Table的全量重写操作,逐行调用会产生大量不必要的性能开销,7万行数据逐行操作自然运行速度极慢。
解决方法

不要手动循环删行,直接使用Astropy Table原生的布尔掩码筛选即可,这是官方推荐的筛选写法,效率和准确率都有保障:

import numpy as np
from astropy.io import fits
from astropy.table import Table
import matplotlib.pyplot as plt

# 读取FITS文件为Table
hdul = fits.open("data_SDSS_Info.fit")
t = Table.read(hdul)
print("Printing data_SDSS_Info in Table format...\n")
print(t)

# 布尔掩码筛选,直接保留第36列等于13的行
# 如果你的第36列有实际业务列名,直接替换col36为对应列名即可,可读性更高
filtered_t = t[t['col36'] == 13]

# 输出结果
filtered_t.write("subsample.fit", overwrite=True)
print("Printing subsample table...")
print(filtered_t)

该方法基于numpy向量化操作实现,7万行数据筛选几乎是毫秒级完成,不会出现卡顿,也不会有索引越界、漏判的问题。

内容的提问来源于stack exchange,提问作者Marco Leonardi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 04:18:04