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

Python 将大量星系分成一定半径的球体,python,numpy,astronomy,Python,Numpy,Astronomy,我有很多星系。我需要将这些星系分成半径为N的球体,计算每个球体中星系的平均数量,并绘制一张半径为N的图表 这些星系以赤经、赤纬和红移的径向坐标存储在.fits文件中。我正在使用pyFITS和astropy将星系坐标转换为地球在0,0,0的笛卡尔坐标,然后将坐标存储在一个numpy数组中,其结构为:x,y,z,x1,y1,z1,等等 为了将星系分成半径为N的球体,我从阵列中随机选择一个星系,然后在阵列中迭代计算随机选择的星系与当前星系之间的距离。如果距离小于或等于半径,则将其添加到球体中。重复次数

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

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

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

我目前的方法非常慢。我对numpy不熟悉,我一直在思考问题,我真的看不到比遍历所有星系更好的方法


有没有一种方法可以更快地实现这一点?我现在正在将它们转换为一个普通的python列表?这就是我现在正在做的。

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

第二,numpy数组对于科学编程非常有用!它们允许您轻松地存储数据并对该数据执行矩阵操作,而无需遍历本机Python列表。如果你了解MATLAB,它们基本上允许你做和MATLAB的数组一样的事情。有关更多信息,请参阅。熊猫数据帧也很好使用

在你的代码上。在read_data函数的末尾,您可以组合一些坐标语句,可能不需要添加tolist,因为它是一个更快、占用更少内存的numpy.array,请参见上面的链接

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

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

for i in np.array([5, 6, 7, 8]):
    print(i)
打印5、6、7、8四次。这也很糟糕,因为我们无法判断我做了什么,没有评论也无济于事。用另一个变量替换第二个循环中的i变量,如j

这里有两个选项可以更快地创建列表:列表理解和初始化numpy.array。您可以阅读有关列表理解的内容。初始化numpy.array的示例如下

最后,您可以为半径创建一个单独的数组,并研究如何使用来选择与您的条件匹配的半径索引


这真是太多了,希望能有所帮助。

哇,这是一些详细的帮助。谢谢
new_data = np.zeros(len(data))

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