将大量星系分类为一定半径的球体

时间:2019-02-24 01:04:36

标签: python numpy astronomy

我有很多星系。我需要将这些星系分类为半径为N的球体,计算每个球体中的平均星系数,并针对半径N绘制一个图。

这些星系作为径向坐标(右上角,赤纬和红移)存储在.fits文件中。我正在使用pyFITS和astropy将星系坐标转换为地球在(0,0,0)的笛卡尔坐标,然后将坐标存储在具有以下结构的numpy数组中:((x,y,z),(x1, y1,z1),等等。

为了将星系分离为半径为N的球体,我从阵列中随机选择一个星系,然后遍历该阵列,计算出随机选择的星系与当前星系之间的距离。如果距离小于或等于半径,则将其添加到球体中。重复此次数与需要计算的气泡数一样。

我目前的方法确实很慢。我不熟悉numpy(我一直在研究事物),除了迭代遍历所有星系之外,我真的看不到更好的方法。

是否可以更快地执行此操作(与numpy数组有关-我现在将它们转换为普通的python列表)?这就是我现在正在做的事情(https://github.com/humz2k/EngineeringProjectBethe/blob/humza/bubbles.py)。

1 个答案:

答案 0 :(得分:2)

首先,通常最好将代码示例张贴在问题所在的问题中(例如,选择要保留的半径的部分),而不要链接到整个脚本:)

第二,numpy数组非常适合科学编程!它们使您可以轻松地存储数据并对该数据执行矩阵运算,而不必遍历本机Python列表。如果您了解MATLAB,它们基本上可以让您完成MATLAB数组所做的大部分相同的事情。可以在herehere中找到更多信息。 pandas数据帧也很好用。

转到您的代码。在read_data函数的末尾,您可以合并其中一些coordinates语句,并且可能不需要添加tolist(),因为它是一个numpy.array(更快并使用较少的内存,请参见上面的链接)。

在您的get_bubbles函数中,我认为您不需要复制数据。副本也将占用内存。我在这里看到的最大问题是在循环中两次使用了变量i。这很糟糕,因为在第二个循环中替换了i。例如,

for i in [1, 2, 3, 4]:

for i in np.array([5, 6, 7, 8]):
    print(i)

打印5, 6, 7, 8四次。这也很糟糕,因为我们无法确定哪个i可以满足您的需求(没有注释也无济于事;))。将第二个循环中的i变量替换为另一个变量,例如j

有两种方法可以使列表更快:列表理解和初始化numpy.arrays。您可以阅读有关列表理解here的信息。初始化numpy.arrays的示例是

new_data = np.zeros(len(data))

for i in range(len(data)):
     new_data[i] = data[i]

最后,您可以为半径创建一个单独的数组,并使用numpy.where查看与您的条件匹配的半径索引。

很多,希望对您有所帮助。