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

问题描述 投票:-1回答:1

我有大量的星系。我需要将这些星系分成半径为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)。

python numpy astronomy
1个回答
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选择符合条件的半径索引。

这有点太多了,希望它有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.