【问题标题】:Python - euclidean distance different size vectorsPython - 欧几里得距离不同大小的向量
【发布时间】:2020-06-26 10:02:37
【问题描述】:

我有一个 numpy 数组大小 (9126,12) 和两个参考聚类点 (2,12),我正在尝试计算到数组的距离以便标记它们。我在实践中理解这是如何发生的,但由于发送不同大小的数组而无法实现。

知道我可以使用 numpy.linalg,但它是家庭作业的一部分,因此不允许这样做。

ValueError: 操作数不能与形状一起广播 (9126,12) (2,12)

def euclid_dist(v1, v2):
    return np.sqrt(((v1-v2)**2).sum(axis = 1))


def check_euclid_dist(data, reference_vectors):
    npdata = data.to_numpy()
    dst = euclid_dist(npdata, reference_vectors)
    # Get the indices of minimum element in numpy array
    result = np.where(dst == np.amin(dst))
    print(result)
    return result

【问题讨论】:

  • 我在这里有点困惑,但我想你是! :) 通常可以计算两个点的距离,这两个点在这里位于 12 维空间中,对吧?参考点的作用在这里很重要。你需要在这里对第一个数组中的所有点进行两次距离计算吗?你可以做 euclid_dist(x,y[0,:]) 然后 euclid_dist(x,y[1,:])。
  • sorry yes 应该更清楚了,需要对12维空间vs两个参考点做两次距离计算!现在当你说它时,它是如此明显!谢谢!花了这么多小时,由于某种原因没有看到那个简单的解决方案!

标签: python euclidean-distance


【解决方案1】:

您可以通过在两个数组中插入一个额外的维度来计算每个向量到每个参考点的距离,并让 Numpy 相互广播它们:

distances = np.linalg.norm(npdata[:, None, ...] - reference_vectors[None, ...], axis=-1)

然后你可以使用np.argmin找到最近的集群:

cluster_id = np.argmin(distances, axis=1)

【讨论】:

    猜你喜欢
    • 2021-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-02
    • 2010-12-15
    相关资源
    最近更新 更多