【问题标题】:Sorting large numbers of galaxies into spheres of a certain radius将大量星系分类成一定半径的球体
【发布时间】:2019-02-24 01:04:35
【问题描述】:

我有很多星系。我需要将这些星系分类成一个半径为 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】:

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

    其次,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 做了你想要的(没有 cmets 也无济于事;))。将第二个循环中的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 来选择符合您条件的半径索引。

    内容有点多,希望对你有所帮助。

    【讨论】:

    • 哇,这是一些详细的帮助。谢谢!
    猜你喜欢
    • 2011-04-12
    • 1970-01-01
    • 2016-07-13
    • 1970-01-01
    • 2020-06-21
    • 1970-01-01
    • 2019-04-25
    • 2018-12-04
    • 1970-01-01
    相关资源
    最近更新 更多