如何在不使用for / while循环的情况下迭代ndarray?

时间:2019-10-26 17:28:51

标签: python numpy numpy-ndarray

对于两个给定的一维数组或列表,我可以通过函数计算欧几里德距离的平方

import numpy as np

def npdistance(x1, x2):

    return sum((np.array(x1)-np.array(x2))**2)

现在对于给定的向量v和2d数组X,我想找到X中包含的任何向量到向量u的最短平方欧氏距离,而无需使用for / while循环遍历X的元素。我的尝试是

def npnearest(u, X):
    L=npdistance(u,X)
    return min(L)

这不能给我我想要的东西。例如

 npnearest(np.array([1,1,1]), np.array([[1,1,1],[2,3,4]]))

请给我16而不是0。我该怎么办?

1 个答案:

答案 0 :(得分:1)

如果是numpy,则首选np.sumnp.min,而不是Python内置插件summin

我们可以将npdistance应用于2D numpy向量:

def npdistance(x1, x2):
    return np.sum((np.array(x1)-np.array(x2))**2, axis=1)

考虑矩阵x2

x2 = np.array([[1,1,1],[2,3,4]])

矩阵x2有两个轴:

  • 零是向量数:x2[0]np.array([1, 1, 1]),而x2[1]np.array([2, 3, 4])
  • 第一轴用于向量维:x2[1][1]3(第一向量的第二个元素)。

我们沿axis=1执行求和,以获得每个向量的距离。

  • 没有np.sum axis=1,它将返回标量,
  • 使用内置sum给出所有向量的总和(ala axis=0)。

npnearest在这种情况下可以正常工作。

def npnearest(u, X):
    L=npdistance(u,X)
    return min(L)

npnearest(np.array([1,1,1]), np.array([[1,1,1],[2,3,4]]))

给出0。