【发布时间】:2020-10-18 22:13:26
【问题描述】:
对于蒙特卡罗模拟,我有 500 个 Person 实例,每个实例都有一个位置(笛卡尔坐标)作为属性。在整个模拟过程中,我需要多次访问两个人之间的距离。我已经定义了一个函数来计算两个人之间的(笛卡尔)距离(为简单起见,我们将此函数称为“距离(loc1,loc2)”)。 我有兴趣使脚本在计算上更高效。我采取的第一步是创建一个对称矩阵来存储距离,而不是在每次需要时计算距离。现在我决定把它做成一个嵌套的 numpy 数组;如果它使事情变得更容易,我可以将其更改为嵌套列表或其他东西。 (我使用这个的改编版本制作了矩阵:Python: Generating a symmetric array with list comprehension) 距离矩阵如下所示:
np.array([[0, 6.44177991, 2.74762143, 3.47162016, 2.0645646 ],
[6.44177991, 0, 1.59860905, 8.99027864, 2.58449879],
[2.74762143 , 1.59860905, 0, 2.06833575, 8.53594684],
[3.47162016, 8.99027864 , 2.06833575, 0, 6.76594943],
[2.0645646, 2.58449879, 8.53594684, 6.76594943, 0]])
在模拟过程中,人的位置(偶尔)会发生变化。发生这种情况时,我需要“更新”矩阵。 我目前使用 for 循环来解决这个问题(见下文),但我想知道是否有更有效的方法来替换这些值。
#note: population is a list containing the 500 Person entities
#e.g. if person5's location changes:
p_id = 5
for i in range(len(population)):
if i!=p_id:
new_distance=distance(population[i].location, population[p_id].location)
distance_matrix[p_id][i] = new_distance
distance_matrix[i][p_id] = new_distance
【问题讨论】:
标签: python multidimensional-array nested-lists processing-efficiency