我正在生成一些目录,并希望有一个评论专栏。出于某种原因,当我生成列并尝试存储注释时,它只需要第一个字符。
from astropy.table import Column
C1 = Column(['']*12, name = 'ID')
C1[4] = 'test comment'
然后
print C1[4]
>> t
看着C1,我看到<Column name='ID' dtype='str1' length=12>
所以它显然只存储1个字符串。
如果我尝试
C2 = Column(['some really long silly string']*12, name = 'ID')
C2[4] = 'test comment'
然后
print C1[4]
>> test comment
但同样,我只能存储29个char字符串,因为<Column name='ID' dtype='str29' length=12>
这无论如何都是一个糟糕的解决方案。
如何告诉Column存储任何长度的字符串?
答案 0 :(得分:0)
对于这个用例,我通常首先将数据收集为Python字符串列表,然后调用astropy.table.Column
构造函数。
>>> from astropy.table import Column
>>> data = ['short', 'something longer']
>>> Column(data=data, name='spam')
<Column name='spam' dtype='str3' length=2>
a
bbb
Column
会将您的数据转换为具有固定宽度dtype
的Numpy数组,用于适当长度的字符串(并使用空格填充较短的字符串)。
类似地,在构造astropy.table.Table
个对象时,我通常首先将数据收集为行数据的Python列表,然后让Table
构造函数自动找出相应的dtype
>>> from astropy.table import Table
>>> rows = [{'ham': 42, 'spam': 'a'}, {'ham': 99, 'spam': 'bbb'}]
>>> table = Table(rows=rows, names=['spam', 'ham'])
>>> table
<Table length=2>
spam ham
str3 int64
---- -----
a 42
bbb 99
当然,这不是超快或内存效率高,但对于我的应用程序来说它已经足够好了。
更一般地说,请注意使用存储在Numpy数组中的字符串(这是astropy.table.Column
正在做的事情)简直是痛苦的(在我看来,对于Numpy开发人员或喜欢它的人来说没有任何冒犯)。我所知道的最佳支持来自pandas
,因此您可以使用pandas
来处理您的数据并使用to_pandas
和from_pandas
方法astropy.table.Table
如果你需要一个Astropy表,例如读取/写入FITS文件或执行pandas.DataFrame
不支持的其他操作。