2016-09-07 47 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不支持的其他操作。

相關問題