使用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
相关产品推荐
相关产品推荐

