2016-09-07 88 views
0

我正在生成一些目录,并希望有一个评论栏。出于某种原因,当我生成列并尝试存储评论时,它只会占用第一个字符。我如何获得astropy Column来存储任意长度的字符串?

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字符字符串,因为<Column name='ID' dtype='str29' length=12>这是一个可怕的解决方案呢。

如何告诉列存储任何长度的字符串?

+1

相关:[numpy可变长度的recarray字符串](http://stackoverflow.com/questions/9108837/numpy-recarray-strings-of-variable-length)。例如,你可以使用'Column([''] * 12,name ='ID',dtype = np.object)'。 – Evert

+0

有趣的是,这似乎工作。如果我设置'dtype = np.str',它仍然默认为'str1'。如果你不能想到另一个解决方法,而没有泛化为'np.object',那么你应该提交这个答案。 – FriskyGrub

+0

像这样的表(numpy的recarray,Pandas的数据框)是为某些固定类型(〜固定内存分配)而设计的,这就是为什么不存在通用(可变)字符串类型的原因。例如,当你用字符串初始化一列时,熊猫会推断出一个“对象”。 – Evert

回答

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将你的数据转换成numpy的阵列具有固定的宽度为dtype适当长度(和左衬较短字符串用空格)的字符串。

同样,在构建astropy.table.Table对象时,我通常首先收集数据作为行数据的Python的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,所以如果你需要一个Astropy表,例如pandas,你可以使用pandas来处理你的数据,并使用to_pandasfrom_pandas方法astropy.table.Table。读取/写入FITS文件或执行pandas.DataFrame不支持的其他操作。

相关问题