【问题标题】:How do I iterate over an ndarray without using for/while loops?如何在不使用 for/while 循环的情况下迭代 ndarray?
【发布时间】:2019-10-27 01:53:09
【问题描述】:

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

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。我该怎么做?

【问题讨论】:

    标签: python numpy numpy-ndarray


    【解决方案1】:

    对于 numpy,更喜欢 np.sumnp.min,而不是 Python 内置 summin

    我们可以将npdistance 适配为二维 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 有两个轴:

    • zeroth 是向量编号:x2[0]np.array([1, 1, 1])x2[1]np.array([2, 3, 4])
    • 第一个轴代表向量维度:x2[1][1]3(第一个向量的第二个元素)。

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

    • 如果没有np.sum axis=1,它将返回标量,
    • 使用 buildin 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。

    【讨论】:

    • “第一轴为向量维数”与x2[1][1]为3的关系是什么?
    • 这意味着第一个轴用于访问向量的标量分量。当x2[i] = [a_0, a_1, a_2],然后x2[i][0] = a_0,...,x2[i][2] = a_2
    猜你喜欢
    • 2020-02-26
    • 1970-01-01
    • 2013-03-29
    • 1970-01-01
    • 2023-02-26
    • 2017-11-22
    • 2017-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多