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

Hua*_*ang 1 python data-conversion coordinates 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
Run Code Online (Sandbox Code Playgroud)

小智 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
Run Code Online (Sandbox Code Playgroud)

并且不要在它上面循环.

c,cc,bl都将阵列(尽管有些是SkyCoord阵列),具有相同的长度ra1dec1.

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


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

在循环(大)列表/数组时,Python并不快,而且它从来就没有意义.