python - 在另一个数组中的位置映射 numpy 数组和求和值

标签 python python-3.x numpy optimization sum

我有 2 个 numpy 数组:

distances = np.array([
    [0, 6, 7, 4, 2],
    [6, 0, 6, 3, 8],
    [7, 6, 0, 9, 3],
    [4, 3, 9, 0, 4],
    [2, 8, 3, 4, 0]
])

path = np.array([3, 1, 2, 0])

path , 有一些我想去的地方。每个位置都是 distances 的索引.所以在上面的例子中,我访问了位置 3 , 然后 1 , 然后 2 , 然后 0然后回到3 .为此,我想计算距离总和 3, 1 , 1, 2 , 2, 00, 3 (路径是封闭的圆圈)。

你可以得到3之间的距离和 1来自 distances[3, 1] (= 3),介于 1 之间和 2来自 distances[1, 2] (= 6) 等。上例中的距离应为 20 .

我创建了这个函数:

import time
import numpy as np

distances = np.array([
    [0, 6, 7, 4, 2],
    [6, 0, 6, 3, 8],
    [7, 6, 0, 9, 3],
    [4, 3, 9, 0, 4],
    [2, 8, 3, 4, 0]
])

path = np.array([3, 1, 2, 0])

def get_distance(path):
    distance = 0

    for i in range(len(path) - 1):
        distance += distances[path[i], path[i + 1]]

    distance += distances[path[-1], path[0]]

    return distance

start = time.time()

for i in range(100000):
    get_distance(path)

end = time.time()
print(end - start) # 0.206

它正在运行,但我需要在长路径(例如 50 个位置)下多次运行此函数(例如百万次),因此我想对其进行优化。有什么办法吗?

最佳答案

我们可以简单地将索引数组切片并索引到 distances 数组中以获得那些特定的距离,然后将它们相加以获得最终输出。与原始代码一样,我们将单独对最后一对求和。因此,这将是 -

distances[path[:-1], path[1:]].sum() + distances[path[-1], path[0]]

关于python - 在另一个数组中的位置映射 numpy 数组和求和值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59005406/

相关文章:

python - 插值到特定时间

python - Gtk.CssProvider() 基于 ID 的选择器如何在 Gtk3 中工作?

python - 在 Python 中查找字符串中的字符数

python - 编写一个程序从字符串中打印 haax

python-3.x - Numpy:轴 1 超出维度 1 数组的范围

python - 在 Pandas 数据框中进行行相关的正确方法

python - 将 pandas DataFrame 列附加到 CSV

python - Python中的数字图像裁剪

python - 自定义 python 对象的 pretty-print __str__

python - FillNa 具有多个条件并在 Pandas 中使用 n-1 和 n+2 值