在previous posts我看到改變dtype
的recarray
可以使用astype
執行。然而,我無法設法用recarray
這個在其中一列中有一個數組的方法。當其中一列是數組時,如何更改numpy recarray的dtype?
我recarray
來自一個FITS文件記錄:
> f = fits.open('myfile.fits')
> tbdata = f[1].data
> tbdata
# FITS_rec([ (0.27591679999999996, array([570, 576, 566, ..., 571, 571, 569], dtype=int16)),
# (0.55175680000000005, array([575, 563, 565, ..., 572, 577, 582], dtype=int16)),
# ...,
# (2999.2083967999997, array([574, 570, 575, ..., 560, 551, 555], dtype=int16)),
# (2999.4842367999995, array([575, 583, 578, ..., 559, 565, 568], dtype=int16)],
# dtype=[('TIME', '>f8'), ('AC', '>i4', (2,))])
我需要AC列從int
轉換爲float
所以我已經試過:
> tbdata = tbdata.astype([('TIME', '>f8'), ('AC', '>f4', (2,))])
,雖然看起來dtype
確實發生了變化
> tbdata.dtype
# dtype([('TIME', '>f8'), ('AC', '>f4', (2,))])
看一下的數據AC表明它們仍然是整數值。例如,一個計算sum
到達int16
變量的限制(所有AC列值是陽性的):
> tbdata['AC'][0:55].sum()
# _VLF(array([31112, 31128, 31164, ..., 31203, 31232, 31262], dtype=int16), dtype=object)
> tbdata['AC'][0:65].sum()
# _VLF(array([-28766, -28759, -28702, ..., -28659, -28638, -28583], dtype=int16), dtype=object)
是否有任何的方式來有效地改變所述陣列的數據類型?
不是答案,只是好奇:根據D型細胞中,「AC」字段是具有形狀的陣列(2)。爲什麼註釋輸出顯示該字段具有更多元素?例如。 'array([570,576,566,...,571,571,569],dtype = int16)' –
我不能重現這一點,但我沒有使用你的FITS庫。我們可以複製並運行一個獨立的示例會很有幫助。不要使用FITS數據;只需「手動」創建一個簡單的dtype和數組即可用於演示問題。 –
@WarrenWeckesser:對於第一個問題,我不確定,但我想這與'AC'字段是一個FITS可變長度數組這一事實有關...... – mtc