Как перебрать ndarray без использования циклов for / while? - PullRequest
0 голосов
/ 26 октября 2019

Для двух заданных одномерных массивов или списков я могу вычислить квадрат евклидова расстояния с помощью функции

import numpy as np

def npdistance(x1, x2):

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

Теперь для заданного вектора v и двумерного массива XI хотел бы найти кратчайший квадрат евклидоварасстояние любого вектора из X до вектора u без итерации по элементам X с циклами for / while. Моя попытка

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 Ответ

1 голос
/ 26 октября 2019

В случае numpy, предпочитайте np.sum и np.min, а не сборки Python sum и min.

. Мы можем адаптировать 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 имеет две оси:

  • нулем является векторное число: x2[0] равно np.array([1, 1, 1]) иx2[1] is np.array([2, 3, 4]),
  • первая ось для векторного измерения: x2[1][1] is 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.

...