我的教授使用IDL并给我发送了一个ASCII数据文件,我最终需要能够读取和操作这些数据。在
他使用以下命令读取数据:
readcol, 'sn-full.txt', format='A,X,X,X,X,X,F,A,F,A,X,X,X,X,X,X,X,X,X,A,X,X,X,X,A,X,X,X,X,F,X,I,X,F,F,X,X,F,X,F,F,F,F,F,F', $
sn, off1, dir1, off2, dir2, type, gal, dist, htype, d1, d2, pa, ai, b, berr, b0, k, kerr
下面是前两行的图片:http://i.imgur.com/hT7YIE3.png
因为我不打算成为一名天文学家,我正在使用Python,但由于我对它还不熟悉,所以我很难读懂数据。在
我知道his代码将数据类型A(字符串数据)分配给列1,使用X跳过第2-6列,然后将数据类型F(浮点)分配给第7列,等等,然后将sn分配给第一列,等等
我试图通过使用numpy.loadtxt("sn-full.txt")
或ascii.read("sn-full.txt")
来复制这一点,但不确定如何输入dtype参数。我知道我可以将所有的数据类型都指定为特定的数据类型,但是如何将数据类型分配给各个列呢?在
使用
astropy.io.ascii
您应该能够相对容易地读取文件:这将为您提供一个包含所有数据列的表。事实上,您有一些不需要的列不是问题,除非表是大行长的。对于您展示的表,您不需要显式地指定数据类型,因为
io.ascii.read
将正确地确定它们。在这里的一个小问题是,您所显示的表实际上是一个固定宽度的表,这意味着所有列都垂直排列。请注意,第一行以
1998S NGC 3877
开头。只要每一行都有相同的模式,用三个空格分隔的列来表示超新星的名称和星系的名称,就可以了。但是如果任何一个星系名称是一个单词,那么解析将失败。我怀疑如果IDLreadcol
正在工作,那么相应的io.ascii
版本应该可以开箱即用。如果不是,那么io.ascii
有一种读取固定宽度表的方法,在表中显式地提供列名和位置。在[编辑] 在本例中,似乎需要一个固定宽度的读取器来通知解析器如何拆分列,而不是仅仅使用空格作为分隔符。因此,基本上需要在表文件的顶部添加两行,第一行给出列名,第二行用破折号表示每列的跨度:
^{pr2}$在
astropy.io.ascii
中,如果不能修改输入数据文件,也可以通过代码指定每列的开始和停止位置,例如:我将使用Pandas来实现这个特殊目的。最简单的方法是,假设列是单制表符分隔的:
(这里的字符串属于常规的“object”数据类型)。在
现在每个列都有一个名称,可以作为
mydata['colname']
进行访问,然后可以像常规numpy1d数组一样对其进行切片,比如mydata['colname'][20:50]
等Pandas内置了对matplotlib的plotting调用,因此您可以通过
mydata['column'].plot()
快速获得一个数值类型列的概述,或者以mydata.plot('col1', 'col2')
的形式对两个不同的列进行比较。可以传递所有正常的绘图关键字。在如果要在普通matplotlib例程中打印数据,只需将列传递到matplotlib,在那里它们将被视为普通Numpy向量。 每个列都可以作为一个普通的Numpy向量作为
mydata['colname'].values
来访问。在编辑
如果您的数据不是一致分离的,numpy的
^{pr2}$genfromtxt()
函数更好。然后可以通过http://casa.colorado.edu/~ginsbura/pyreadcol.htm看起来像你想要的那样。它模拟IDL的readcol函数。在
另一种可能是https://pypi.python.org/pypi/fortranformat。看起来它的功能可能更强大,您所查看的数据是固定格式的,而格式说明符(X、A等)是fortran格式说明符。在
相关问题 更多 >
编程相关推荐