给定n个点的列表,如何使用numpy生成包含从每个点到每个其他点的距离的矩阵?

时间:2016-06-03 14:08:48

标签: python matlab numpy matrix

嘿伙计们,所以我正在尝试在python中重写以下matlab代码:

repmat(points, 1, length(points)) - repmat(points', length(points),1);

points是一个包含几个点的弧度值的数组。

上面的代码给出了一个像这样的矩阵输出:

 0   1   2   0   1   2   0   1   2
-1   0   1  -1   0   1  -1   0   1
-2  -1   0  -2  -1   0  -2  -1   0
 0   1   2   0   1   2   0   1   2
-1   0   1  -1   0   1  -1   0   1
-2  -1   0  -2  -1   0  -2  -1   0
 0   1   2   0   1   2   0   1   2
-1   0   1  -1   0   1  -1   0   1
-2  -1   0  -2  -1   0  -2  -1   0

我可以轻松操控以获得从每个点到每个其他点的距离。

我只是想知道是否有使用numpy的 one liner 方式吗?

我尝试了以下无效的方法:

np.tile(points, (1, len(points))) - 
            np.tile(points.T, (len(points), 1))

任何人都有任何想法?

3 个答案:

答案 0 :(得分:7)

在MATLAB中,您必须使用repmat,因为您需要-左侧和右侧的数组大小相同。有了numpy,这不一定是因为numpy的automatic broadcasting。相反,您可以简单地从另一个中减去一个,自动广播将创建预期大小的结果。

# Create some example data
points = np.array([[1,2,3,4]]);

# Just subtract the transpose from points
B = points - points.T

#   array([[ 0,  1,  2,  3],
#          [-1,  0,  1,  2],
#          [-2, -1,  0,  1],
#          [-3, -2, -1,  0]])

如果points只是一维数组,那么@ JoshAdel的答案应该适合你(也使用广播),或者你可以将它转换成2D数组。

答案 1 :(得分:4)

您可能想看看scipy.spatial.pdist

但是如果points只是一维数组,那么构建你正在寻找的原始矩阵:

points = np.array([1,2,3,4])
points[:,None] - points[None,:]

如果你有一个2D数组,那么@ Suever的转置方法效果很好。

答案 2 :(得分:0)

我不熟悉matlab代码。但是,只是尝试计算从每个列向量到每个其他列向量的欧氏距离:

np.sqrt((np.square(A[:, None].T - A.T)).sum(axis=2))

array([[ 0.,  3.,  6.,  0.,  3.,  6.,  0.,  3.,  6.],
       [ 3.,  0.,  3.,  3.,  0.,  3.,  3.,  0.,  3.],
       [ 6.,  3.,  0.,  6.,  3.,  0.,  6.,  3.,  0.],
       [ 0.,  3.,  6.,  0.,  3.,  6.,  0.,  3.,  6.],
       [ 3.,  0.,  3.,  3.,  0.,  3.,  3.,  0.,  3.],
       [ 6.,  3.,  0.,  6.,  3.,  0.,  6.,  3.,  0.],
       [ 0.,  3.,  6.,  0.,  3.,  6.,  0.,  3.,  6.],
       [ 3.,  0.,  3.,  3.,  0.,  3.,  3.,  0.,  3.],
       [ 6.,  3.,  0.,  6.,  3.,  0.,  6.,  3.,  0.]])