Is there a more efficient way to generate a distan

2019-08-18 06:57发布

问题:

I was wondering if there is a more straight forward, more efficient way of generating a distance matrix given the H x W of the matrix, and the starting index location.

For simplicity lets take a 3x3 matrix where the starting point is (0,0). Thus, the distance matrix to be generated is:

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

Index (0,1) is 1 distance away, while index (2,2) is 2.828 distance away.

The code I have so far is below:

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)

This is pretty efficient already, I think. But numpy always surprise me with some tricks that I usually never think of, so I was wondering if there exist one in this scenario. Thanks

回答1:

You can use hypot() and broadcast:

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

or the outer method:

np.hypot.outer(x, x)

the result:

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

to calculate the distance between every point on a grid to a fixed point (x, y):

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