如何获取astropy Column来存储任何长度的字符串?

时间:2016-09-07 01:56:44

标签: python string ascii astropy

我正在生成一些目录,并希望有一个评论专栏。出于某种原因,当我生成列并尝试存储注释时,它只需要第一个字符。

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存储任何长度的字符串?

1 个答案:

答案 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_pandasfrom_pandas方法astropy.table.Table如果你需要一个Astropy表,例如读取/写入FITS文件或执行pandas.DataFrame不支持的其他操作。