AstroPy SkyCoord极其缓慢,如何重新启用呢?

时间:2016-03-22 04:37:02

标签: python coordinates data-conversion astropy

我正在使用AstroPy SkyCoord从赤道坐标到数百万个数据的银河坐标转换,这是非常缓慢的。任何人都有想加快速度,否则需要永远运行整个数据集。代码如下:

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

ra1 = np.loadtxt('data.txt',usecols=(0,))
dec1 = np.loadtxt('data.txt',usecols=(1,))
size = len(ra1)
for i in range(size):
    ra = ra1[i]
    dec = dec1[i]
    c = SkyCoord(ra*u.degree, dec*u.degree)
    cc = c.galactic
    b = cc.b.degree
    l = cc.l.degree

1 个答案:

答案 0 :(得分:11)

  

我循环遍历整个数据,但逐个进行转换。

不要那样做。想象矢量,就像numpy一样。星座中的大多数例程都是以矢量方式使用的。

因此:

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

c = SkyCoord(np.array(ra1)*u.degree, np.array(dec1)*u.degree)
cc = c.galactic
b = cc.b.degree
l = cc.l.degree

并且不要循环它。

cccbl都将是数组(尽管有些是SkyCoord数组),长度与{{1}相同}和ra1

对于您机器上的180,000,运行时间不到一秒。

当您的数据(列表)增长到超过10,000或100,000个元素时,您几乎不必在Python 中运行for循环。使用numpy(或astropy here),或者如果没有其他选项,请寻找Cython甚至用C语言编写代码。(或者使用PyPi,但这会失去很多库兼容性。)

在循环(大)列表/数组时,Python并不快,而且它从来就不是。