我有很多星系。我需要将这些星系分类为半径为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)。
答案 0 :(得分:2)
首先,通常最好将代码示例张贴在问题所在的问题中(例如,选择要保留的半径的部分),而不要链接到整个脚本:)
第二,numpy
数组非常适合科学编程!它们使您可以轻松地存储数据并对该数据执行矩阵运算,而不必遍历本机Python列表。如果您了解MATLAB,它们基本上可以让您完成MATLAB数组所做的大部分相同的事情。可以在here和here中找到更多信息。 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查看与您的条件匹配的半径索引。
很多,希望对您有所帮助。