是否有更有效的方法来生成numpy中的距离矩阵

时间:2018-01-10 02:34:13

标签: python numpy matrix euclidean-distance

我想知道在给定矩阵的H x W和起始索引位置的情况下是否有更直接,更有效的方法来生成距离矩阵。

为简单起见,我们采用3x3矩阵,其起点为(0,0)。因此,要生成的距离矩阵是:

[[ 0.          1.          2.        ]
 [ 1.          1.41421356  2.23606798]
 [ 2.          2.23606798  2.82842712]]

指数(0,1)距离1个距离,指数(2,2)距离2.828个距离。

我到目前为止的代码如下:

def get_distances(start, height, width):
        matrix = np.zeros((height, width), dtype=np.float16)
        indexes = [(y, x) for y, row in enumerate(matrix) for x, val in enumerate(row)]
        to_points = np.array(indexes)
        start_point = np.array(start)
        distances = np.linalg.norm(to_points - start_point, ord=2, axis=1.)

    return distances.reshape((height, width))



height = 3
width = 3
start = [0,0]
distance_matrix = get_distances(start, height, width)

我认为这已经非常有效了。但是numpy总是让我感到惊讶,我通常从未想到过一些技巧,所以我想知道这个场景中是否存在一个。感谢

1 个答案:

答案 0 :(得分:1)

您可以使用hypot()并广播:

import numpy as np
x = np.arange(3)
np.hypot(x[None, :], x[:, None])

outer方法:

np.hypot.outer(x, x)

结果:

array([[ 0.        ,  1.        ,  2.        ],
       [ 1.        ,  1.41421356,  2.23606798],
       [ 2.        ,  2.23606798,  2.82842712]])

计算网格上每个点与固定点(x, y)之间的距离:

x, y = np.ogrid[0:3, 0:3]
np.hypot(x - 2, y - 2)