彻底摆脱单位

时间:2018-08-02 17:08:45

标签: python python-3.x numpy astropy

我有一个很大的(262615,3)值数组,所有值都附加了单位。专门源自此函数:

def coordconvert(data):
    from astropy.coordinates import SkyCoord
    from astropy import units as u
    import numpy as np 

    R   = data[:,0]
    ra  = data[:,1]
    dec = data[:,2]

    c = SkyCoord(ra=ra*u.degree,dec=dec*u.degree,distance=R*u.mpc)
    outdata = c.cartesian.xyz

    return outdata

我希望此数组的单位减少,因此我可以轻松地将其写入文本文件。 在任何人链接Stack Exchange question询问类似问题之前,我曾尝试使用.magnitude,但它不起作用。另外,我想补充一下,由于数组的性质,如果可能的话,我希望使用最有效的方法。

数据样本:

 <Quantity -473.698 mpc> <Quantity -38.3794 mpc> <Quantity -1832.23 mpc>
 <Quantity -2269.57 mpc> <Quantity -842.855 mpc> <Quantity -2445.88 mpc>

2 个答案:

答案 0 :(得分:5)

您的c.cartesian.xyz是“数量”对象。它具有unit属性和value属性。

value属性是一个Numpy数组,我想这就是您想要的。

示例:

>>> from astropy.coordinates import SkyCoord
>>> c = SkyCoord(10, 20, unit='deg')
>>> c.cartesian.xyz
<Quantity [0.92541658, 0.16317591, 0.34202014]>
>>> c.cartesian.xyz.value
array([0.92541658, 0.16317591, 0.34202014])
>>> type(c.cartesian.xyz.value)
numpy.ndarray

答案 1 :(得分:2)

只需使用value属性,但需要确保您指定感兴趣的坐标的部分和单位,例如R.A.值:

from astropy.coordinates import SkyCoord
from astropy import units as u

c = SkyCoord(ra=[0., 1., 100.] *u.degree,dec=[1., 2., -3.]*u.degree)

c.ra

>> <SkyCoord (ICRS): (ra, dec) in deg
>> [(   0.,  1.), (   1.,  2.), ( 100., -3.)]>

c.ra.value
>> array([   0.,    1.,  100.])

您还可以获取不同格式的单位,例如小时/弧度/弧度角

c.ra.arcmin
>> array([    0.,    60.,  6000.])