嘿伙计们,所以我正在尝试在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))
任何人都有任何想法?
答案 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.]])